第 4 课
常见 Hash 错误
避免应用与调试中典型的 Hash 误用。
Hash 相关问题,往往来自“想法对了,但字节或算法错了”。
用裸 MD5 或 SHA-256 存密码
没有 salt 和密钥拉伸的快速 Hash,容易被彩虹表和离线猜测攻破。密码存储应使用专门的密码 Hash 函数,并为每个用户使用唯一 salt。
Hash 了错误的表示形式
以下并不等价:
- UTF-8 文本
Hello - 去掉首尾空白后的 ASCII 字节
- 键顺序不同的 JSON 字符串
- 带或不带末尾换行符的文件
务必 Hash 系统实际使用的那段字节序列。
把 Hash 当成秘密
如果攻击者知道输入空间很小——常见密码、递增 ID、短配置键——就可以离线暴力破解 Hash。Hash 适合完整性对比,不能保护可预测输入的机密性。
用错算法或格式做对比
同一输入的 MD5 与 SHA-256 结果必然不同,因为算法不同。十六进制大小写通常可互换,但 Base64 与 hex 不能不经转换直接对比。
用弱 Hash 做安全决策
MD5 checksum 适合发现意外文件损坏,不适合代码签名、证书校验,或对抗主动篡改者的完整性证明。