什么是哈希函数?
一个 哈希函数 可以把任何内容——一句话、一个软件、一个几十吉字节的备份——变成长度固定的字符串,称为 哈希值 或摘要。三条性质定义了它:无论输入是什么,输出长度始终相同;相同的内容永远产生相同的哈希值;而从哈希值反推输入在实践中必须做不到。正是第三点,把密码学哈希与 CRC32 这样的校验和区分开来。
具体来说,绝大部分场景只有两种用途。 校验完整性 :发布者公布文件的哈希值,您重新计算一次,两者相等就说明下载没有被篡改。 比较内容 :与其保存文档本身,不如保存它们的哈希值——相同即代表内容相同,却丝毫不泄露内容是什么。
今天该选哪个算法?
SHA-256 是默认答案:先由 NSA 标准化,随后被普遍采用,每种语言都有实现,且没有已知碰撞。 SHA-512 适合 64 位处理器上的大批量处理,在这类架构上通常比它的兄弟算法更快。 SHA-384 除了是一条更长的变体之外并无特别之处。若要用密钥对消息签名,则以 HMAC-SHA-256 为标准做法:它把密钥与哈希结合起来,只有持钥者才能生成相同的值。
而 MD5 和 SHA-1 在非敏感校验中仍然有用——索引、缓存、查重——这些场合速度比抗性更重要。而 CRC32,本身并不是密码学哈希:它能发现意外的改动,可蓄意制造的改动几秒钟就能做出来。
为什么说 MD5 和 SHA-1 已被攻破?
因为研究人员分别为它们构造出了 两份不同却共享同一哈希值的文档。MD5 的演示可追溯到 2004 年;SHA-1 则在 2017 年被真正制造出碰撞,名为 SHAttered。一次碰撞就足以击穿签名:如果攻击者来选定文档,而发布者只是计算它的哈希,攻击者就能拿到一份会为另一份内容背书的签名。正因如此,TLS 证书、软件更新和软件包签名都已弃用这些算法。
哈希做不到的事
计算哈希不等于加密:哈希值在设计上不可逆,但它并不会靠让内容变得不可读来保护内容。哈希不加密任何东西,既不能替代 TLS,也不能替代加密密钥,单独使用也保护不了密码——那是 bcrypt、scrypt 或 Argon2 这些专为慢速设计的函数的工作。另外,算两遍也不会更安全:把算法串联起来,只是在本该由一个未被攻破的函数承担的地方多加了一层脆弱的外壳。
推荐人群
核对发行版校验和的系统管理员与 IT 负责人,为制品封存或认证 webhook 的开发者,检查备份完整性的审计与合规人员,比较文档却不外传的记者与分析师,学习哈希值、碰撞与盐等概念的密码学学生——以及任何想要 快速计算内容哈希 且不留痕迹的人,配套工具还有 密码生成器、Base64 编解码器、 JWT 解码器、 正则表达式测试器 和 字符计数器.