密码学基础
校招考察频度:☆ 中频(原理扩展·工程加分项)
后端安全的地基:哈希存密码、对称加密数据、非对称交换密钥。面试主线:三类算法怎么用、密码怎么存、密钥怎么管。
三类算法
| 类别 | 代表 | 用途 | 特点 |
|---|---|---|---|
| 哈希 | SHA-256、bcrypt | 完整性、密码存储 | 不可逆 |
| 对称加密 | AES | 数据加密 | 快,密钥分发难 |
| 非对称 | RSA、ECC | 密钥交换、签名 | 慢,公钥公开 |
密码存储(高频)
| 方案 | 评价 |
|---|---|
| 明文 | 灾难 |
| MD5/SHA1 | 可彩虹表破解 |
| 加盐哈希(单盐) | 弱:同盐同哈希 |
| bcrypt/scrypt/argon2 | 标准:内置盐 + 慢哈希抗暴力 |
# 正确姿势 (见 FastAPI 鉴权篇)
password_hash = bcrypt.hashpw(pw.encode(), bcrypt.gensalt())
bcrypt.checkpw(pw.encode(), password_hash) # 恒定时间比较要点:每用户独立盐 + 慢哈希 + 恒定时间比较。别自己发明哈希算法。
对称 vs 非对称
- 对称(AES):同一密钥加解密。快,适合大量数据。密钥怎么安全传给对方是问题
- 非对称(RSA/ECC):公钥加密私钥解密。慢,用于小数据(密钥交换、签名)
- 混合:非对称交换对称密钥,对称加密数据(TLS 就是,见 HTTPS 与 TLS 篇)
- 签名:私钥签名公钥验签(防篡改 + 认证来源),JWT 就是签名应用
常见错误
| 错误 | 后果 |
|---|---|
| 自己设计加密 | 必被攻破(用标准库) |
| ECB 模式 | 模式泄露(用 GCM) |
| 密钥硬编码 | 源码泄露即数据泄露 |
| 明文存敏感数据 | 拖库即裸奔 |
| 弱随机数 | 可预测(用 CSPRNG) |
密钥管理
- 密钥分级:主密钥 + 数据密钥(信封加密)
- 集中管理:KMS/Vault,不落代码和配置文件
- 轮换:定期换密钥,支持多版本解密
- 环境隔离:开发/生产密钥分离
- 云上:云 KMS(自动轮换、审计)
面试追问
- 密码怎么存? bcrypt/argon2:每用户盐 + 慢哈希 + 恒定时间比较。MD5 加盐也弱
- 对称和非对称? 对称快(数据加密),非对称慢(密钥交换/签名)。TLS 混合使用
- 签名是什么? 私钥签公钥验:防篡改 + 认证来源。JWT 的 signature
- ECB 为什么不行? 相同明文相同密文,模式泄露。用 GCM 等认证加密
- 密钥放哪? KMS/Vault,环境变量都不理想(进程可见)。分级 + 轮换 + 审计