第1章 加密入门
对称加密:一把钥匙开一把锁
你想想看,你和你的同事要共享一份机密文档。你们约定好同一个密码,你加密,他解密。这就是对称加密——加解密用同一把密钥。说白了,就像你用同一把钥匙锁门和开门。
我在项目中遇到过最典型的案例:某金融App的本地数据存储,用的就是AES-256-GCM。为什么选GCM?因为它自带认证,防篡改。嗯,这里要注意,对称加密的核心优势是快,非常快。硬件加速下,AES加密1MB数据只需要几毫秒。但代价呢?密钥分发是个大麻烦——你总不能把密钥直接写在邮件里吧?
| 算法 | 密钥长度 | 分组模式 | 典型场景 |
|---|---|---|---|
| AES | 128/192/256 bit | ECB/CBC/GCM/CTR | 文件加密、数据库加密 |
| DES (已弃用) | 56 bit | ECB/CBC | 不再推荐,密钥太短 |
| SM4 (国密) | 128 bit | CBC/CTR/GCM | 国内合规场景 |
非对称加密:公钥开锁,私钥锁门
非对称加密就完全不一样了。你有一对密钥:公钥可以公开,私钥只有你自己知道。别人用你的公钥加密数据,只有你能用私钥解密。这解决了对称加密的密钥分发难题。
我个人习惯用RSA-2048或ECC P-256。RSA虽然老,但兼容性极好;ECC在同等安全强度下密钥更短,性能更好。举个例子:HTTPS握手的第一步,客户端用服务器的公钥加密一个临时对称密钥,服务器再用私钥解密——这就是混合加密的经典应用。
常见算法回顾:AES与RSA
AES(Advanced Encryption Standard)自2001年就是全球标准。我常用AES-256-GCM,密钥32字节,nonce 12字节,加密后附带16字节认证标签。代码长这样(Python示例):
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import os
key = os.urandom(32) # 256位密钥
nonce = os.urandom(12) # 96位随机数
cipher = Cipher(algorithms.AES(key), modes.GCM(nonce), backend=default_backend())
encryptor = cipher.encryptor()
ciphertext = encryptor.update(b"Hello World") + encryptor.finalize()
tag = encryptor.tag
RSA则依赖大整数分解难题。1024位已被破解,现在至少2048位,推荐4096。RSA加解密速度慢,通常只用于加密对称密钥或数字签名。记得给密钥加一个私钥加密密码(passphrase),否则私钥文件泄露就全完了。
密钥管理的基本挑战
说来简单,做起来全是坑。密钥管理是密码学里最容易被忽视、也最容易出事故的环节。我总结了三大挑战:
- 存储安全:密钥不能硬编码在代码里,不能明文写在配置文件中。我见过有人把AES密钥写在Java属性文件里,后来那个文件被传到了GitHub——嗯,那叫一个惨。
- 轮换与生命周期:密钥不能永不过期。你应该制定轮换策略——比如每90天更换一次数据加密密钥。但我遇到过一些系统,密钥从上线就没换过,直到被攻破才意识到。
- 访问控制:谁有权限读取密钥?需要严格按最小权限原则。我曾经审计过一个系统,所有微服务共享同一个数据库加密密钥,结果一个服务被入侵,所有数据都暴露了。
小结
这一章我们复习了对称加密(AES/SM4)和非对称加密(RSA/ECC)的核心差异。重点不在算法细节,而在理解它们各自的优缺点和适用场景。密钥管理的三大挑战——存储、轮换、访问控制——会贯穿整个课程。记住:算法是公开的,安全全靠密钥。把密钥守住了,你就守住了底线。