一、加密基础:对称加密与非对称加密原理、哈希函数与消息认证码、数字签名与证书体系

加密这件事,说穿了就是「把明文变成只有持有钥匙的人才能看懂的东西」。我在早期做DevOps时,总觉得加密是安全团队的事,直到有一次CI/CD流水线泄露了数据库连接串…嗯,从那以后我恨不得给每个配置文件都上锁。今天咱们就把这四大块掰开揉碎,把原理讲透。

1.1 对称加密:一把钥匙开一把锁

对称加密,顾名思义——加密和解密用的是同一把密钥。你想想看,就像你家里的门锁,同一把钥匙既能锁门也能开门。这种方式速度极快,适合加密大量数据。

核心思路:发送方用密钥加密,接收方用同一个密钥解密。问题来了——密钥怎么安全地给到对方?这也就是后面非对称加密要解决的难题。

常见对称加密算法

算法密钥长度特点
AES128/192/256 bits目前最常用,硬件加速支持好
DES56 bits太短了,已被破解
3DES112/168 bitsDES的改进,但效率低
SM4128 bits国密标准,国内项目常用

我在刚接手一个金融项目时,对方要求必须用国密。当时我还不熟悉SM4,专门啃了一遍文档。说白了,SM4和AES的加密模式差不多,只是算法细节不同。如果你要在国内政企项目里混,国密是绕不开的。

我的建议:优先选AES-256-GCM。GCM模式自带认证,可以防篡改,比CBC模式更现代。我自己所有的配置文件加密都用的这个。
避坑指南:千万不要用ECB模式!它会把明文分块后独立加密,相同的明文块会产生相同的密文块。我曾经见过一个日志系统用ECB模式加密用户ID,结果攻击者通过统计密文分布直接推断出了用户行为模式。

1.2 非对称加密:公钥私钥各司其职

非对称加密就高级一些了——一对密钥:公钥公开,私钥保密。公钥加密的数据只有私钥能解开;反过来,私钥签名,公钥验证。这样我们再也不需要担心密钥传输问题了。

但你也猜得到,它比对称加密慢得多(大概慢100~1000倍)。所以实际应用中,我们通常用非对称加密来协商对称密钥,再交给对称加密去处理大数据——这就是混合加密的思路。

常见非对称算法对比

算法安全性基础密钥长度性能
RSA大整数分解2048/4096 bits较慢,密钥越长越慢
ECC(椭圆曲线)椭圆曲线离散对数256 bits(等效RSA 3072)快,密钥短
SM2椭圆曲线(国密)256 bits同ECC,国内适用

我个人更喜欢ECC。RSA 4096 bits的密钥文件动辄几KB,而ECC 256 bits的密钥只有几十字节。特别是在IoT设备或TLS握手场景里,这个差异很明显。我记得有次优化一个微服务间的TLS握手延迟,把RSA换成ECC,握手时间直接从150ms降到了30ms。

混合加密流程示意:
1. 客户端生成临时对称密钥(会话密钥)。
2. 用服务器公钥加密这个会话密钥,发送给服务器。
3. 服务器用私钥解密,获得会话密钥。
4. 双方用这个对称密钥进行后续通信。

1.3 哈希函数与消息认证码

哈希函数是个单向的黑盒——输入任意长度的数据,输出固定长度的摘要,而且从摘要推不出原文。它不加密,但用来验证完整性特别顺手。

哈希函数的硬性要求

  • 抗原像性:给定哈希值,无法反推出原文。
  • 抗第二原像性:给定原文和哈希,找不到另一个原文使哈希相同。
  • 抗碰撞性:找不到任意两个不同的原文有相同哈希。

常用哈希算法

算法输出长度安全性状态
MD5128 bits已被碰撞攻击,别用了
SHA-1160 bits理论已不安全,弃用
SHA-256256 bits目前推荐,足够安全
SHA-3可配置最新标准,但还没全面普及
SM3256 bits国密哈希,国内项目必选

你可能会问:哈希不是能验证文件有没有被改过吗?那为什么还需要消息认证码(MAC)?

因为哈希只是保证数据没变,但不能验证是谁发的。中间人可以篡改后重新计算哈希值告诉你“文件是完整的”。所以我们需要HMAC(基于哈希的消息认证码)——它把密钥和消息混在一起哈希。只有持有密钥的人才能生成正确的MAC。我做过一个配置下发服务,每个配置文件都附上HMAC,客户端验证通过才加载,这样即使配置被劫持,攻击者也伪造不了。

实用技巧:HMAC的密钥长度应该和哈希算法的输出长度匹配。SHA-256对应的HMAC密钥至少32字节。别用太短的密钥,安全性会打折。

1.4 数字签名与证书体系

数字签名,说白了就是用私钥对消息的哈希值做非对称加密。接收方用公钥解密,比对哈希值。如果一致,说明消息确实来自私钥持有者,且未被篡改。

  1. 发送方计算消息的哈希值。
  2. 用私钥加密哈希值,得到签名。
  3. 发送方把消息和签名一起发给接收方。
  4. 接收方用公钥解密签名,得到原始哈希值。
  5. 接收方自己计算消息的哈希值,比对。

但这里有个大问题:你怎么确保你拿到的公钥真的是对方的?万一中间人替换了公钥呢?

这就引出了证书体系(PKI)。证书本质上是把一个公钥和身份信息绑在一起,然后由一个大家都信任的机构(CA,证书颁发机构)给它签名。你只要信任CA,就可以通过CA的签名来信任证书里的公钥。

证书链长这样

  • 根证书:自签名,浏览器/操作系统内置。
  • 中间证书:由根证书签名,用于签发最终证书。
  • 服务器证书:包含网站域名和公钥,由中间证书签名。
我曾经踩过的坑:某次部署内部CA时,根证书过期了我没注意到,结果所有服务间的TLS握手全挂了。记住,根证书的有效期一般10~20年,中间证书2~5年,服务器证书1年。建议用脚本定期检查证书有效期,别等出事了再补救。

1.5 知识体系总览

下面这张图把本讲的核心知识点串到了一起。你可以把它当个记忆地图,后面学具体流程时随时回来瞄一眼。

加密基础知识体系结构图 加密基础 · 四大核心概念 对称加密 AES / SM4 / 3DES 非对称加密 RSA / ECC / SM2 哈希函数 SHA-256 / SM3 数字签名与证书 PKI / CA / 证书链 消息认证码MAC HMAC 混合加密 哈希值用于签名 核心关系 • 对称加密:速度快 • 非对称加密:密钥分发 • 哈希:完整性 • 签名:身份+完整性 现实应用 • TLS握手:非对称+对称 • 代码签名:哈希+签名 • 配置校验:HMAC • 身份认证:证书链
个人习惯:我每次搭建新服务时,都会先画一张类似的关系图。加密不是一个孤立的点——对称加密保效率,非对称加密保密钥分发,哈希和MAC保完整性,签名和证书保身份。把它们组合起来,才能构建安全的DevOps流水线。

以上就是加密基础的四个支点。理解这些概念,后面讲具体协议和工具时,你就会发现它们都离不开这里面的某个原理。嗯,咱们继续。