2、密码学基础:对称加密与非对称加密、哈希函数、数字签名、密钥管理基础
各位同学,咱们今天聊聊密码学。说实话,很多刚入行的朋友一听到“密码学”三个字就头大,觉得那是数学家干的事。其实不然,在PIS系统里,你不需要成为密码学专家,但必须懂它的核心思想。我做了这么多年系统,吃过不少亏,今天就把这些经验掰开揉碎了讲给你听。
2.1 对称加密:一把钥匙开一把锁
对称加密,说白了就是加密和解密用同一把钥匙。就像你家里的门锁,用这把钥匙锁门,也用这把钥匙开门。简单、高效,这是它的最大优点。
我在项目中遇到过这么个事:早期做PIS系统时,站台显示屏和中心服务器之间传输实时到站信息。数据量很大,每秒都在更新。当时我选了对称加密,为什么?因为快啊!非对称加密算一次的时间,对称加密能算几十次。
常用的对称加密算法有这些:
| 算法 | 密钥长度 | 特点 | 我的建议 |
|---|---|---|---|
| AES | 128/192/256位 | 目前最主流,硬件加速支持好 | PIS系统首选,用256位 |
| DES | 56位 | 太老了,已被破解 | 别用了,真的 |
| 3DES | 112/168位 | DES的加强版,但效率低 | 能不用就不用 |
| SM4 | 128位 | 国密标准,国内项目必须 | 做国内项目时必选 |
核心要点:对称加密的痛点是密钥分发。你想想看,如果通信双方要用同一把钥匙,那这把钥匙怎么安全地交给对方?这就是所谓的“密钥配送问题”。
我的小技巧:在PIS系统里,我习惯把对称密钥分成两段存储。一段存在硬件安全模块里,一段存在配置文件中。就算配置文件泄露了,没有硬件那一段,谁也解不开。
2.2 非对称加密:公钥私钥,各司其职
非对称加密就聪明多了。它有一对钥匙:公钥和私钥。公钥可以公开给任何人,私钥自己死死藏好。用公钥加密的数据,只有对应的私钥能解开;反过来,用私钥签名的数据,大家用公钥就能验证。
为什么会这样?嗯,这里涉及一点数学原理。简单说就是基于大整数分解或椭圆曲线上的离散对数问题。你不需要深究,只要知道:从公钥反推私钥,在计算上是不可行的。
常用的非对称算法:
- RSA:最经典,2048位以上才安全。我早期项目都用它,但现在慢慢转向ECC了。
- ECC(椭圆曲线):同样安全强度下,密钥更短,计算更快。256位的ECC相当于3072位的RSA。
- SM2:国密标准,基于ECC。国内PIS项目必须支持。
注意:非对称加密虽然解决了密钥分发问题,但性能是硬伤。我曾经在PIS系统的车载终端上做过测试,RSA 2048位加密一次要几十毫秒。如果数据量大,系统直接卡死。所以实际项目中,我们通常用非对称加密来传递对称密钥,然后用对称加密来加密业务数据。
2.3 哈希函数:数据的指纹
哈希函数,你可以把它想象成给数据按个指纹。不管数据多大,哈希函数都能算出一个固定长度的摘要。而且,哪怕只改了一个比特,摘要结果就完全不一样。
哈希函数有几个关键特性:
- 单向性:从摘要反推原始数据,理论上不可能。我见过有人想暴力破解MD5,算到天荒地老也算不出来。
- 抗碰撞性:很难找到两个不同的数据,它们的哈希值相同。MD5和SHA-1已经被发现碰撞了,所以别用了。
- 雪崩效应:输入微变,输出巨变。这个特性在PIS系统里做数据完整性校验时特别有用。
常用的哈希算法:
| 算法 | 摘要长度 | 安全状态 | 我的推荐 |
|---|---|---|---|
| MD5 | 128位 | 已破解,不安全 | 别用了,除非做非安全场景的校验 |
| SHA-1 | 160位 | 已发现碰撞,不推荐 | 尽快迁移 |
| SHA-256 | 256位 | 安全 | PIS系统首选 |
| SM3 | 256位 | 国密标准,安全 | 国内项目必选 |
避坑指南:我曾经在PIS系统的日志完整性校验中用了MD5。后来发现攻击者可以伪造日志而不改变MD5值。从那以后,所有涉及安全的场景,我至少用SHA-256。
2.4 数字签名:谁说这是你发的?
数字签名解决的是三个问题:身份认证、数据完整性、不可否认性。说白了,就是证明“这条消息确实是你发的,而且没被人改过”。
数字签名的流程是这样的:
- 发送方对消息做哈希,得到摘要。
- 发送方用自己的私钥对摘要加密,这就是签名。
- 接收方用发送方的公钥解密签名,得到摘要A。
- 接收方对收到的消息做哈希,得到摘要B。
- 如果A等于B,说明消息是完整的,而且确实是发送方发的。
在PIS系统里,数字签名用得很多。比如列车到站信息的广播,中心服务器给每个站台发指令时,都会带上签名。站台收到后先验签,确认没问题才执行。这样就算有人伪造了指令,站台也能识别出来。
我的经验:签名和加密是两回事。签名用私钥,加密用公钥。很多人搞混了。记住一句话:私钥签名,公钥验签;公钥加密,私钥解密。
2.5 密钥管理基础:钥匙丢了,锁再好也没用
密钥管理,这是整个密码体系中最薄弱也最容易出问题的一环。我见过太多项目,算法选得挺好,结果密钥直接硬编码在代码里,或者存在配置文件里明文存储。这就像你买了一把顶级防盗锁,结果钥匙挂在门上。
密钥管理的基本原则:
- 密钥生成:必须用真随机数生成器。伪随机数生成的密钥,理论上是可以预测的。Linux下的/dev/random就挺好。
- 密钥存储:绝对不能明文存储。我习惯用硬件安全模块(HSM)或者密钥管理服务(KMS)。小项目至少也要用加密文件系统。
- 密钥分发:对称密钥的分发,通常用非对称加密来保护。比如用接收方的公钥加密对称密钥,再传过去。
- 密钥轮换:密钥不能一直用。我建议对称密钥每30天换一次,非对称密钥每1-2年换一次。
- 密钥销毁:密钥不用了,必须彻底销毁。不能只是删文件,要覆写。我见过有人直接rm删除,结果数据恢复工具还能找回来。
警告:密钥管理没有银弹。我曾经在PIS系统里用了一个看起来很完美的密钥管理方案,结果运维人员嫌麻烦,直接把密钥打印出来贴在服务器机柜上。嗯,从那以后我明白了,技术方案再好,也要考虑人的因素。
好了,密码学基础就讲到这里。下一章我们聊聊PIS系统里具体的通信加密协议怎么选、怎么配。记住,密码学不是万能的,但没有密码学是万万不能的。