密码学基础:对称加密与非对称加密、哈希函数与数字签名、PKI公钥基础设施

各位同学,今天我们来聊聊密码学。说实话,很多做电子交易系统的朋友,一听到「密码学」三个字就头大。我当年刚入行时也一样,觉得这东西太数学、太抽象了。但干久了你会发现——不懂密码学,你根本没法保护交易数据

咱们不扯那些复杂的数学公式。我尽量用大白话,把对称加密、非对称加密、哈希函数、数字签名、PKI 这套东西讲明白。嗯,开始吧。

一、对称加密:简单粗暴,但有个致命问题

对称加密,说白了就是「一把钥匙开一把锁」。加密和解密用同一个密钥。

你想想看,A 要给 B 发一条消息。A 用密钥 K 加密,B 收到后用同样的密钥 K 解密。就这么简单。

常见的对称加密算法有:

  • AES(高级加密标准)—— 目前最主流,我项目中几乎都用它
  • DES(数据加密标准)—— 太老了,密钥只有56位,现在基本被淘汰
  • 3DES —— DES 的加强版,但效率低,也不推荐了
  • SM4 —— 国密标准,国内项目必须考虑

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

致命问题:密钥分发。A 和 B 怎么安全地拿到同一个密钥?如果通过网络传输密钥,万一被截获,整个加密就废了。

我在项目中遇到过一件事。早期做一个内部系统,团队图省事,直接把对称密钥硬编码在代码里。结果代码泄露到 GitHub 上了……嗯,那晚我加班到凌晨三点,帮他们换密钥。所以记住:对称加密的密钥管理,是头等大事

二、非对称加密:解决密钥分发难题

非对称加密的思路就巧妙多了。它用一对密钥:公钥私钥

  • 公钥可以公开,谁都可以拿
  • 私钥只有自己知道,打死也不能给别人

公钥加密的数据,只能用私钥解密。反过来,私钥加密的数据,只能用公钥解密。

常见的非对称加密算法:

算法 密钥长度 特点
RSA 1024/2048/4096位 最经典,应用最广,但密钥越长越慢
ECC(椭圆曲线) 256位左右 同等安全强度下,密钥更短,速度更快
SM2 256位 国密标准,基于ECC

举个例子。A 要给 B 发消息。A 用 B 的公钥加密消息,B 收到后用 B 的私钥解密。就算中间人截获了密文,他没有私钥,也解不开。

我的建议:实际项目中,很少单独用非对称加密来加密大量数据。因为它太慢了。通常的做法是「混合加密」—— 用非对称加密传输对称密钥,然后用对称密钥加密实际数据。HTTPS 就是这么干的。

三、哈希函数:不可逆的「数字指纹」

哈希函数,你可以把它理解成一种「单向压缩」。不管输入多长,输出固定长度。而且从输出反推输入,几乎不可能。

常见的哈希算法:

  • MD5 —— 128位输出,但已被证明不安全,别再用了
  • SHA-1 —— 160位输出,也已被攻破
  • SHA-256 —— 目前推荐,256位输出
  • SM3 —— 国密标准,256位输出

哈希函数在电子交易系统里,主要干三件事:

  1. 数据完整性校验 —— 文件下载后算个哈希,对比一下就知道有没有被篡改
  2. 密码存储 —— 用户密码不能明文存,存哈希值。但注意,要加盐(salt)
  3. 数字签名的基础 —— 这个下面讲

避坑指南:我曾经见过一个项目,直接用 MD5 存用户密码,连盐都没加。结果数据库泄露后,彩虹表一查,大部分密码直接暴露。记住:密码存储用 bcrypt、scrypt 或 Argon2,别自己造轮子。

四、数字签名:证明「你是谁」和「你没改过」

数字签名,说白了就是「电子世界的盖章+防篡改」。它结合了哈希函数和非对称加密。

流程是这样的:

  1. A 对消息计算哈希值
  2. A 用自己的私钥加密这个哈希值,得到「数字签名」
  3. A 把消息和签名一起发给 B
  4. B 用 A 的公钥解密签名,得到哈希值 H1
  5. B 对收到的消息计算哈希值 H2
  6. 如果 H1 == H2,说明消息确实是 A 发的,而且没被篡改

你想想看,这解决了两个核心问题:

  • 身份认证:只有 A 的私钥能生成这个签名,所以签名一定是 A 干的
  • 完整性:消息一旦被改,哈希值就对不上了

在电子交易系统里,数字签名无处不在。订单签名、交易凭证、合同签署……我做过一个支付系统,每笔交易都要做双重签名,确保不可抵赖。

五、PKI 公钥基础设施:信任的基石

好,问题来了。非对称加密里,你怎么确定你拿到的公钥,真的是对方的?

比如你访问一个网站,浏览器拿到一个公钥。你怎么知道这个公钥不是中间人伪造的?

这就是 PKI 要解决的问题。

PKI 的核心组件:

  • CA(证书颁发机构) —— 可信的第三方,负责签发数字证书
  • 数字证书 —— 把公钥和身份信息绑定在一起,由 CA 签名
  • 证书链 —— 根 CA → 中间 CA → 终端证书,一层层信任传递
  • CRL/OCSP —— 证书吊销列表/在线证书状态协议,检查证书是否有效

我画了一张图,帮你理解 PKI 的信任链:

根 CA(自签名) 中间 CA 服务器证书 客户端证书 电子交易系统(HTTPS / 数字签名 / 加密通信)

你看,信任是一层一层传递的。你的浏览器里预装了根 CA 的证书,根 CA 签发了中间 CA,中间 CA 签发了网站证书。只要根 CA 可信,整条链就可信。

核心要点:PKI 解决的是「公钥归属」问题。没有 PKI,非对称加密就是空中楼阁。你连对方是不是本人都不知道,加密还有什么意义?

六、实战中的密码学选型建议

说了这么多,我给大家总结一下,在电子交易系统里,密码学到底怎么用:

场景 推荐方案 备注
数据传输加密 TLS 1.3(混合加密) HTTPS 标配,别用 TLS 1.0/1.1
数据存储加密 AES-256-GCM 带认证的加密模式,防篡改
密码存储 bcrypt / Argon2 别用 MD5、SHA-1、甚至 SHA-256 直接存
数字签名 RSA-2048 / ECDSA P-256 性能敏感场景优先选 ECDSA
证书管理 使用 ACME 协议自动续期 Let's Encrypt 免费又好用

个人经验:我建议你在设计系统时,把密码学相关的配置做成可切换的。比如密钥算法、哈希算法、证书路径等。因为密码学算法会老化,今天安全的算法,十年后可能就不安全了。可配置的设计,能让你在不改代码的情况下升级算法。

好了,密码学基础就讲到这里。这些东西是电子交易系统的地基。地基不稳,上面盖多高的楼都没用。希望大家在实际项目中,能把这些原理用起来,别等到出了安全事件才后悔。


公众号:蓝海资料掘金营,微信deep3321