加密基础理论:对称加密与非对称加密的区别

说到加密,我经常被问到这样一个问题:「到底用对称加密还是非对称加密?」

这个问题,其实没有标准答案。得看场景。

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

对称加密,说白了就是加密和解密用同一把密钥。就像你家的门锁,用钥匙锁上,再用同一把钥匙打开。

常见的对称加密算法有:

  • AES(高级加密标准)—— 我现在项目里最常用的
  • DES(数据加密标准)—— 太老了,不建议再用
  • SM4(国密算法)—— 国内项目必须考虑

核心特点:

  • 速度快,适合大量数据加密
  • 密钥管理是痛点 —— 怎么安全地把密钥传给对方?

我在基站项目里遇到过一个问题:基站和核心网之间要传输大量信令数据。用非对称加密?太慢了。最后我们用了 AES-256,配合动态密钥协商机制。嗯,这里要注意,密钥不能写死在代码里,否则一旦被逆向,整个网络就裸奔了。

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

非对称加密就有点意思了。它有两把钥匙:公钥和私钥。公钥可以公开,私钥自己藏着。

你想想看,别人用你的公钥加密数据,只有你能用私钥解密。这不就解决了密钥分发的问题吗?

常见的非对称加密算法:

  • RSA —— 经典但越来越吃力
  • ECC(椭圆曲线加密)—— 我个人更推荐,同等安全强度下密钥更短
  • SM2(国密)—— 国内政企项目标配

我的建议:实际项目中,别只用一种。混合使用才是王道。用非对称加密协商对称密钥,然后用对称加密处理实际数据。这叫「混合加密体系」,HTTPS 就是这么干的。

哈希函数的作用

哈希函数,很多人以为它是加密。其实不是。它是「指纹」。

哈希函数的特点:

  • 输入任意长度,输出固定长度(比如 SHA-256 输出 256 位)
  • 不可逆 —— 从哈希值推不出原文
  • 抗碰撞 —— 很难找到两个不同输入产生相同输出

我曾经踩过一个坑:用 MD5 做文件完整性校验。结果发现攻击者可以构造碰撞,伪造文件。后来全部换成了 SHA-256。记住,MD5 和 SHA-1 现在已经不安全了,别再用。

哈希函数在基站安全里的典型应用:

  • 密码存储 —— 存哈希值,不存明文密码
  • 消息完整性校验 —— 发消息时附带哈希值,接收方重新计算对比
  • 数字签名的基础 —— 先哈希,再签名

数字签名与完整性校验

数字签名,说白了就是「盖章」。证明这消息是你发的,而且没被改过。

流程是这样的:

  1. 发送方对消息做哈希,得到摘要
  2. 用私钥加密这个摘要,生成签名
  3. 把消息和签名一起发出去
  4. 接收方用公钥解密签名,得到摘要
  5. 接收方自己对消息做哈希,对比两个摘要

关键点:数字签名解决的是「谁发的」和「改没改」两个问题。完整性校验只解决「改没改」。

我记得有一次做基站 OTA(空中升级)安全方案。固件包如果不做数字签名,攻击者可以植入恶意固件。我们用了 ECDSA 签名,每次升级前校验签名。嗯,这里有个细节:签名用的私钥必须硬件隔离,存在安全芯片里,不能放在文件系统里。

密钥管理基础概念

密钥管理,这是整个加密体系里最容易出问题的地方。算法再强,密钥泄露了,一切白搭。

密钥管理包含几个核心环节:

环节 说明 常见问题
密钥生成 必须用真随机数,不能用伪随机 随机数种子被预测
密钥分发 安全地传给通信双方 中间人攻击
密钥存储 加密存储,硬件隔离 硬编码在代码里
密钥更新 定期更换,防止长期使用 忘记更新,密钥过期
密钥销毁 彻底删除,不可恢复 只删文件,磁盘残留

避坑指南:我曾经见过一个项目,密钥生成用的是 C 语言的 rand() 函数。这函数是伪随机的,种子固定的话每次生成的「随机数」都一样。攻击者只要拿到一次密钥,就能预测后续所有密钥。后来我们换成了硬件随机数发生器。

在基站网络里,密钥管理尤其重要。一个基站可能管理上千个用户设备,每个设备都有会话密钥。怎么管理这么多密钥?

我的做法是分层管理:

  • 主密钥 —— 长期有效,存在 HSM(硬件安全模块)里
  • 会话密钥 —— 每次通信临时生成,用完就销毁
  • 派生密钥 —— 从主密钥通过 KDF(密钥派生函数)生成

你想想看,如果所有设备都用同一个密钥,一个设备被攻破,整个网络就完了。分层管理的好处是:即使某个会话密钥泄露,也只影响那一次通信,主密钥还是安全的。

个人经验:密钥管理没有银弹。我的原则是:能硬件就不软件,能动态就不静态,能短期就不长期。这三个「能...不...」帮我避了不少坑。

好了,这一章的内容就到这里。加密基础理论是后面所有安全机制的地基。地基打不牢,上面盖再高的楼也是危房。下一章我们聊聊基站网络里具体的加密协议实现,到时候会用到今天讲的所有概念。