密码学基础
说真的,很多搞TLS的人,密码学基础是薄弱的。
我自己早年也踩过坑。有一次排查一个SSL握手失败的问题,查了三天,最后发现是签名验证时哈希算法用错了。从那以后,我要求团队每个人必须先把这四个核心概念搞透:对称加密、非对称加密、哈希函数、数字签名。
它们是TLS的基石。不理解它们,密钥边界保护就是空中楼阁。
对称加密
对称加密,说白了就是加密和解密用同一把钥匙。
你想想看,就像你家大门,一把钥匙既能锁门也能开门。发送方用密钥加密数据,接收方用同一个密钥解密。速度快,适合加密大量数据。
核心特征:同一个密钥,既用于加密,也用于解密。
我在项目中遇到过一个问题。一个银行内部系统,用对称加密传输交易数据,密钥放在配置文件里。结果运维同事不小心把配置提交到了Git仓库。嗯,整个系统都得换密钥。
常用的对称加密算法:
- AES – 目前最主流的选择。我个人习惯用AES-256-GCM,带认证,能防篡改。
- SM4 – 中国国家密码标准,国密TLS里的核心算法。
- 3DES – 老了,别用了。我见过还在用3DES的项目,性能差还不安全。
非对称加密
和对称加密不同,非对称加密用一对密钥:公钥和私钥。
公钥可以公开,私钥必须保密。公钥加密的数据,只有私钥能解开。反过来,私钥签名的数据,公钥可以验证。
我经常跟新人说:公钥是锁,私钥是钥匙。你把锁给别人,别人锁上箱子,只有你能打开。
实用建议:非对称加密速度慢,不适合加密大量数据。TLS里主要用于密钥交换和身份认证。
举个例子:TLS握手阶段,客户端用服务器的公钥加密一个临时密钥(前向保密场景下会复杂一些,但原理类似),服务器用私钥解密。之后双方用这个临时密钥做对称加密通信。
常见算法:
- RSA – 经典,但逐渐被淘汰。密钥越长越慢。
- ECC(椭圆曲线) – 更短的密钥达到相同安全强度。TLS 1.3 首选。
- SM2 – 国密标准,基于椭圆曲线。
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1个 | 2个(公钥+私钥) |
| 速度 | 快(硬件加速) | 慢(数学运算复杂) |
| 典型用途 | 批量数据加密 | 密钥交换、数字签名 |
| 密钥管理难度 | 高(需安全分发) | 较低(公钥可公开) |
哈希函数
哈希函数,你可以把它理解成数据的数字指纹。
任意长度的数据,经过哈希函数,输出一个固定长度的字符串。而且,哪怕原数据只改一个比特,哈希结果都会变得面目全非。
为什么TLS需要它?
- 验证数据完整性 – 收发双方对比哈希值,就知道数据有没有被篡改。
- 密码存储 – 不存明文密码,存哈希值。
- 证书签名 – 先对证书内容做哈希,再对哈希值签名,效率更高。
避坑指南:我曾经见过一个团队直接用MD5做TLS证书签名。MD5已经能被碰撞攻击了,这在安全审计里是致命问题。切记,生产环境至少用SHA-256。
常用哈希算法:
- SHA-256 – 当前最低安全标准。
- SHA-3 – 新一代标准,更安全,但生态还在建设中。
- SM3 – 国密标准,输出256位,对标SHA-256。
哈希是单向的。你没办法从哈希值反推出原始数据。这个特性在TLS的密钥派生和证书验证里非常关键。
数字签名
数字签名解决的是身份认证和不可否认性。
签名过程:发送方用私钥对数据的哈希值加密,生成签名。接收方用公钥验证签名。
为什么先哈希再签名?因为非对称加密太慢了。对哈希值签名,相当于给整个数据打了一个防伪标签。
我记得有一次做国密TLS改造,客户问:“我怎么证明这个证书真的是CA签发的?”答案就在数字签名里。CA用自己的私钥签名证书,浏览器用CA的公钥验证。只要签名通过,证书就是真实的。
通俗理解:数字签名 = 对数据的哈希值做非对称加密。
常见的签名算法:
- RSA-PSS – RSA的现代变体,比传统RSA签名更安全。
- ECDSA – 基于椭圆曲线,TLS 1.3 推荐。
- SM2 签名 – 国密标准,与ECDSA类似但不同。
这里有个细节:签名算法和哈希算法是绑定的。比如 ECDSA 通常搭配 SHA-256,SM2 搭配 SM3。选错了,握手就会失败。
好,这四个基础概念搞清楚了,我们就能理解国密TLS的密钥边界保护到底在保护什么。下面这张图梳理了它们之间的关系。
看到这个图你就明白了。TLS协议把四个基础技术串起来了:
- 非对称加密用来安全传递对称密钥
- 对称加密用来加密实际通信数据
- 哈希函数确保数据没被篡改
- 数字签名确认通信双方的身份
缺了任何一个,整个安全体系都会有漏洞。国密TLS也一样,只是把算法换成了SM2、SM3、SM4。逻辑是相通的。
个人习惯:我每次做TLS调试,第一件事就是确认这四个基础组件是否配置正确。算法不匹配、密钥长度不够、签名验证失败,八成问题出在这里。