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 哈希函数:数据的指纹

哈希函数,你可以把它想象成给数据按个指纹。不管数据多大,哈希函数都能算出一个固定长度的摘要。而且,哪怕只改了一个比特,摘要结果就完全不一样。

哈希函数有几个关键特性:

  1. 单向性:从摘要反推原始数据,理论上不可能。我见过有人想暴力破解MD5,算到天荒地老也算不出来。
  2. 抗碰撞性:很难找到两个不同的数据,它们的哈希值相同。MD5和SHA-1已经被发现碰撞了,所以别用了。
  3. 雪崩效应:输入微变,输出巨变。这个特性在PIS系统里做数据完整性校验时特别有用。

常用的哈希算法:

算法 摘要长度 安全状态 我的推荐
MD5 128位 已破解,不安全 别用了,除非做非安全场景的校验
SHA-1 160位 已发现碰撞,不推荐 尽快迁移
SHA-256 256位 安全 PIS系统首选
SM3 256位 国密标准,安全 国内项目必选

避坑指南:我曾经在PIS系统的日志完整性校验中用了MD5。后来发现攻击者可以伪造日志而不改变MD5值。从那以后,所有涉及安全的场景,我至少用SHA-256。

2.4 数字签名:谁说这是你发的?

数字签名解决的是三个问题:身份认证、数据完整性、不可否认性。说白了,就是证明“这条消息确实是你发的,而且没被人改过”。

数字签名的流程是这样的:

  1. 发送方对消息做哈希,得到摘要。
  2. 发送方用自己的私钥对摘要加密,这就是签名。
  3. 接收方用发送方的公钥解密签名,得到摘要A。
  4. 接收方对收到的消息做哈希,得到摘要B。
  5. 如果A等于B,说明消息是完整的,而且确实是发送方发的。

在PIS系统里,数字签名用得很多。比如列车到站信息的广播,中心服务器给每个站台发指令时,都会带上签名。站台收到后先验签,确认没问题才执行。这样就算有人伪造了指令,站台也能识别出来。

我的经验:签名和加密是两回事。签名用私钥,加密用公钥。很多人搞混了。记住一句话:私钥签名,公钥验签;公钥加密,私钥解密。

2.5 密钥管理基础:钥匙丢了,锁再好也没用

密钥管理,这是整个密码体系中最薄弱也最容易出问题的一环。我见过太多项目,算法选得挺好,结果密钥直接硬编码在代码里,或者存在配置文件里明文存储。这就像你买了一把顶级防盗锁,结果钥匙挂在门上。

密钥管理的基本原则:

  • 密钥生成:必须用真随机数生成器。伪随机数生成的密钥,理论上是可以预测的。Linux下的/dev/random就挺好。
  • 密钥存储:绝对不能明文存储。我习惯用硬件安全模块(HSM)或者密钥管理服务(KMS)。小项目至少也要用加密文件系统。
  • 密钥分发:对称密钥的分发,通常用非对称加密来保护。比如用接收方的公钥加密对称密钥,再传过去。
  • 密钥轮换:密钥不能一直用。我建议对称密钥每30天换一次,非对称密钥每1-2年换一次。
  • 密钥销毁:密钥不用了,必须彻底销毁。不能只是删文件,要覆写。我见过有人直接rm删除,结果数据恢复工具还能找回来。

警告:密钥管理没有银弹。我曾经在PIS系统里用了一个看起来很完美的密钥管理方案,结果运维人员嫌麻烦,直接把密钥打印出来贴在服务器机柜上。嗯,从那以后我明白了,技术方案再好,也要考虑人的因素。

好了,密码学基础就讲到这里。下一章我们聊聊PIS系统里具体的通信加密协议怎么选、怎么配。记住,密码学不是万能的,但没有密码学是万万不能的。