密码学基础
后端安全的地基:哈希存密码、对称加密数据、非对称交换密钥。面试主线:三类算法怎么用、密码怎么存、密钥怎么管。
三类算法
密码存储(高频)
# 正确姿势 (见 FastAPI 鉴权篇)
password_hash = bcrypt.hashpw(pw.encode(), bcrypt.gensalt())
bcrypt.checkpw(pw.encode(), password_hash) # 恒定时间比较
要点:每用户独立盐 + 慢哈希 + 恒定时间比较。别自己发明哈希算法。
对称 vs 非对称
- 对称(AES):同一密钥加解密。快,适合大量数据。密钥怎么安全传给对方是问题
- 非对称(RSA/ECC):公钥加密私钥解密。慢,用于小数据(密钥交换、签名)
- 混合:非对称交换对称密钥,对称加密数据(TLS 就是,见 HTTPS 与 TLS 篇)
- 签名:私钥签名公钥验签(防篡改 + 认证来源),JWT 就是签名应用
常见错误
密钥管理
- 密钥分级:主密钥 + 数据密钥(信封加密)
- 集中管理:KMS/Vault,不落代码和配置文件
- 轮换:定期换密钥,支持多版本解密
- 环境隔离:开发/生产密钥分离
- 云上:云 KMS(自动轮换、审计)
面试追问
- 密码怎么存? bcrypt/argon2:每用户盐 + 慢哈希 + 恒定时间比较。MD5 加盐也弱
- 对称和非对称? 对称快(数据加密),非对称慢(密钥交换/签名)。TLS 混合使用
- 签名是什么? 私钥签公钥验:防篡改 + 认证来源。JWT 的 signature
- ECB 为什么不行? 相同明文相同密文,模式泄露。用 GCM 等认证加密
- 密钥放哪? KMS/Vault,环境变量都不理想(进程可见)。分级 + 轮换 + 审计