第2章 密码学基础
密码学是整个安全架构的地基。说实话,很多人觉得密码学就是一堆数学公式,离实际工程很远。但你要设计端到端安全,密码学是绕不开的硬知识。
我早年做第一个安全项目时,以为随便选个加密算法就算完事了。结果上线第一天就被曝出密钥硬编码——那感觉,真是后背发凉。从那以后,我对密码学的每一个细节都不敢马虎了。
对称加密:又快又简单,但密钥怎么传?
对称加密,说白了就是加密和解密用同一个密钥。你想把数据加密塞进信封,再交给对方,对方用同一把钥匙打开。我习惯用AES-256,它目前是行业标准。
- 常用算法:AES(推荐)、SM4(国密)、3DES(已过时)
- 优点:计算速度快,适合大数据量加密
- 痛点:密钥配送问题——你怎么安全地把密钥发给对方?
非对称加密:公钥私钥,天生一对
非对称加密用一对密钥:公钥加密,私钥解密。公钥可以公开,私钥必须保密。它的核心价值在于解决了密钥分发问题——你不用偷偷传递密钥,直接把公钥扔给对方就行。
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1个密钥 | 2个密钥(公钥+私钥) |
| 速度 | 快(硬件加速可达GB/s) | 慢(主流千倍差距) |
| 典型场景 | 大数据量加密 | 密钥交换、数字签名 |
| 算法举例 | AES-256 | RSA-2048、SM2、ECC |
不过非对称加密计算开销大。所以实际工程中我们不会用它加密整个文件,而是用来加密对称密钥——也就是混合加密。比如HTTPS就是这样做的。
哈希函数:不可逆的指纹
哈希函数能把任意长度的输入转换成固定长度的摘要。它是不可逆的——你无法从摘要反推出原始数据。我第一次理解它的作用是在做文件完整性校验时:把下载后的文件算一个SHA-256值,和官网对比,就知道有没有被篡改过。
- 常用算法:SHA-256(推荐)、SM3(国密)、MD5(已被攻破,别用了)
- 主要用途:数据完整性校验、密码存储、数字签名
数字签名:你说是你发的,怎么证明?
数字签名 = 哈希 + 非对称加密。流程很简单:发送方用私钥对摘要签名,接收方用公钥验签。谁也伪造不了——除非私钥泄露。我参与过一个金融交易系统,所有订单都强制RSA-SHA256签名,就是为了防抵赖。
- 发送方计算文档的哈希值
- 用自己的私钥加密哈希值,得到签名
- 接收方用发送方公钥解密签名,得到哈希值1
- 接收方重新计算文档哈希值,得到哈希值2
- 对比两个哈希值,相同则签名有效
密钥管理基础:密钥安全是整个系统的底线
密钥管理不是技术问题,是工程纪律问题。我见过太多项目因为密钥泄漏而导致全盘皆输。密钥管理至少包含以下要点:
- 密钥生成:必须使用真随机数生成器(TRNG),不能用伪随机
- 密钥存储:不要明文存储,用HSM或密钥管理服务(KMS)
- 密钥分发:非对称用证书,对称用Diffie-Hellman或KMS
- 密钥轮换:定期更换,比如90天轮换一次
- 密钥销毁:销毁时要覆写多遍,不能只删除文件
PKI体系:让公钥不再裸奔
PKI(公钥基础设施)解决的核心问题是:你怎么确认这个公钥就是真正属于对方的?PKI通过证书链来建立信任。每一张证书由上一级CA(证书颁发机构)签名,根CA自签名。
我做过的一个政务系统需要打通多级CA,每个单位都用自己的子CA签发证书。调试证书链的时候,最烦的就是中间证书缺失或过期。嗯,用openssl验签是基本功。
# 验证证书链
openssl verify -CAfile rootCA.crt -untrusted intermediate.crt server.crt
- X.509证书:包含公钥、颁发者、有效期、签名等
- CRL/OCSP:证书撤销机制,防止证书泄露后继续被信任
- 信任锚:浏览器、操作系统预置的根证书
国密算法简介:中国造,要会用
国密算法是中国国家密码管理局推荐的密码算法标准。现在等保2.0和关键信息基础设施都要求优先使用国密。说实话,刚开始接触时觉得和AES、RSA差不多,但实际实现中坑不少。
| 国密算法 | 对应国际算法 | 用途 |
|---|---|---|
| SM2 | ECC(椭圆曲线) | 非对称加密、数字签名 |
| SM3 | SHA-256 | 哈希函数 |
| SM4 | AES | 对称加密 |
| SM9 | 基于标识的密码 | IBE(无证书) |
我的习惯是:如果项目面向国内政务、金融、关键基础设施,直接上国密。国际项目则首选AES+ECC+RSA。但核心原则不变——算法选对了,密钥管好了,安全才有基础。