密码学基础(一):对称加密与非对称加密的区别,哈希函数的作用与特性

说实话,很多刚入行的朋友一听到「密码学」三个字就头大。我当年也一样,总觉得这是数学家才该操心的事。直到我在一个实际项目里,因为选错了加密方式,导致整个系统的密钥管理彻底失控……嗯,从那以后我才老老实实把基础补上。

这一章咱们就聊聊三个最核心的概念:对称加密、非对称加密、哈希函数。搞懂它们,你就能理解签名验签工具到底在干什么。

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

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

它的工作流程很简单:

  1. 发送方用密钥 K 把明文加密成密文
  2. 接收方用同一个密钥 K 把密文解密回明文

常见的对称加密算法有这些:

算法 密钥长度 特点
AES 128/192/256 位 目前最主流,安全高效
DES 56 位 太老了,别用了
3DES 112/168 位 过渡方案,性能差
SM4 128 位 国密标准,国内项目常见

核心优势:速度快,适合加密大量数据。

致命短板:密钥怎么安全地传给对方?

我在一个物联网项目里就踩过这个坑。设备和服务端之间用 AES 加密通信,一开始觉得挺完美。结果设备量一上来,几千个设备的密钥分发、更新、销毁……简直是一场噩梦。你想想看,如果密钥在传输过程中被截获,那加密还有什么意义?

我曾经犯过的错:把对称密钥硬编码在客户端代码里。结果 APK 被反编译,密钥直接暴露。从那以后,我再也不敢把密钥放在客户端了。

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

非对称加密就聪明多了。它用一对密钥:公钥公开,私钥保密。公钥加密的数据只能用私钥解密,私钥加密的数据只能用公钥解密。

这就像什么呢?你做一个信箱,任何人都可以用你的公钥(信箱的投信口)往里塞信,但只有你有私钥(信箱钥匙)能打开取信。

常见的非对称加密算法:

算法 密钥长度 用途
RSA 2048/4096 位 加密、签名
ECC 256 位起 更短的密钥,同等安全强度
SM2 256 位 国密标准,基于椭圆曲线

它的核心价值在于解决了密钥分发问题。你不需要事先和对方商量一个共同密钥,直接把公钥扔出去就行。私钥自己保管好,谁都不给。

但代价也很明显——慢。RSA 加密几 KB 的数据还行,要是加密一个几百 MB 的视频文件,那得等到天荒地老。

实际项目中的做法:混合加密。用非对称加密传输对称密钥,然后用对称密钥加密实际数据。既解决了密钥分发问题,又保证了性能。HTTPS 就是这么干的。

对称 vs 非对称:一张图看懂

我画了一张对比图,帮你直观理解两者的区别:

对称加密 vs 非对称加密 对称加密 明文 密钥 密文 同一个密钥,加密解密都用它 速度快,但密钥分发困难 非对称加密 明文 公钥 密文 公钥加密,私钥解密 速度慢,但密钥分发安全 核心区别总结 对称加密:密钥相同,适合大量数据 非对称加密:密钥成对,适合小数据 优点:性能高,硬件支持好 优点:无需共享密钥,安全性高 缺点:密钥分发困难 缺点:性能差,密钥长度长 实际方案:混合加密(非对称传密钥 + 对称加密数据)

哈希函数:不可逆的指纹

哈希函数跟加密不一样。它没有密钥,也不可逆。你给它一段数据,它返回一个固定长度的摘要。哪怕只改一个比特,摘要就完全变了。

它的三个核心特性:

  • 单向性:从哈希值无法反推出原始数据。这是数学上保证的,不是靠算法保密。
  • 抗碰撞性:很难找到两个不同的输入,产生相同的哈希值。
  • 雪崩效应:输入微变,输出剧变。

常见的哈希算法:

算法 输出长度 安全性
MD5 128 位 已破解,别用了
SHA-1 160 位 理论上可碰撞,弃用
SHA-256 256 位 目前安全,推荐使用
SM3 256 位 国密标准,国内项目首选

我曾经踩过的坑:在密码存储时用了 MD5。结果用户数据库泄露,虽然密码是哈希过的,但彩虹表一查,大部分密码都还原出来了。后来我改用 bcrypt 加盐,才真正放心。

哈希在签名验签中的角色

你可能会问:哈希跟签名验签有什么关系?关系大了。

签名验签的核心流程是这样的:

  1. 对原始数据做哈希,得到摘要
  2. 用私钥对摘要加密,得到签名
  3. 验证时,用公钥解密签名,得到摘要 A
  4. 对原始数据做哈希,得到摘要 B
  5. 比较 A 和 B,一致则签名有效

为什么要先哈希再签名?直接加密原始数据不行吗?

当然可以,但效率太低了。非对称加密很慢,如果原始数据有几百 MB,加密一次得等半天。哈希之后,数据变成固定长度的摘要(比如 32 字节),再对这个摘要签名,又快又安全。

一句话总结:哈希函数是签名验签的「压缩器」,把任意长度的数据压缩成固定长度的指纹,然后用非对称加密对这个指纹签名。

三种技术的协作关系

我再用一个流程图,帮你理清这三者在签名验签中的协作关系:

签名验签中的密码学协作 原始数据 哈希函数(SHA-256) 摘要(32字节) 私钥加密 → 签名 收到的数据 哈希函数(SHA-256) 公钥解密 → 摘要 比较两个摘要是否一致

你看,整个流程里,哈希函数负责压缩和防篡改,非对称加密负责身份认证。两者缺一不可。

我的个人习惯:在项目里,我一般用 SHA-256 做哈希,用 ECC 做签名。ECC 的密钥比 RSA 短很多,签名速度也快,特别适合移动端和嵌入式设备。