哈希函数的分类、原理与常见误区
本文主要讨论两个问题一是哈希函数有哪些二是能用同样的哈希函数反向还原原始内容否一、哈希函数有哪些分类及代表哈希函数按用途主要分为三大类1)加密型哈希函数安全/防篡改用于数字签名、文件完整性校验、区块链。要求抗碰撞性极强难以找到两个不同输入产生相同输出。经典代表MD5已破解不安全输出 128 位32 位十六进制存在碰撞漏洞不可用于加密校验仅可做简易文件标识、SHA-1已弃用被证明可构造碰撞数字证书已淘汰、SHA-2目前主流如SHA-256比特币所用区块链、文件校验、密码存储最常用SHA-3最新标准新一代标准抗量子攻击能力更强包含 SHA3-224/256/384/512。2)非加密型哈希函数查重指纹/快速定位/分片用于哈希表、分片、数据库索引、负载均衡一致性哈希。要求速度快、分布均匀不要求防碰撞碰撞了再解决冲突就行。经典代表MurmurHash、CityHashGoogle出品、XXHash、FNV-1a。这些速度极快但完全不安全可被恶意构造碰撞。3)密码学慢哈希函数存密码用于存储用户登录密码。要求计算极慢故意慢下来防暴力破解。经典代表bcrypt、PBKDF2、scrypt、Argon2密码哈希大赛冠军。二、能用同样的哈希函数反向处理出原始内容吗先给答案是不行。哪怕用同样的哈希函数也永远无法“反向处理”出原始内容。这不是技术没到位而是数学逻辑上的根本不可能。原因有三层第一层信息丢失鸽巢原理/压缩哈希函数的输出长度是固定的比如SHA-256永远输出256位而输入内容可以是无限长的比如一部100GB的电影。想象一下有无数个不同的输入但会都被映射到有限的“输出盒子”里。必然存在无数个不同的原始内容对应着同一个哈希值。拿到一个哈希值即便反向计算也只能得到“无数种可能答案之一”而无法确定到底是哪一个。补充一点SHA-256输出256位是为了减少这种不同内容输出一个哈希值的发生概率256位的相同概率极低。第二层单向陷门数学不可逆好的加密哈希函数在设计上就是单向函数。它的计算过程包含大量位运算如循环移位、异或、非线性S盒替换。数学上正向计算是\( y f(x) \)非常简单。但要求解\( x f^{-1}(y) \)会面临极其复杂的模逆运算和多元高次方程组计算复杂度是指数级的在宇宙毁灭前都算不完。第三层极简逻辑实验用MD5对“123456”哈希结果是 e10adc3949ba59abbe56e057f20f883e。哈希函数的算法里根本没有存储“减法”、“除法”或“逆向查表”的指令。它只定义了“怎么把原始数据搅拌成乱码”但从未定义“怎么把乱码搅拌回原始数据”。算法本身就是“只进不出”的。一个常见疑问那为什么网上有“在线解密MD5”的网站这会造成严重的认知混淆。那些网站不是“反向计算”而是“暴力碰撞查询”。它们提前用巨大的算力把所有常见的密码如123456、password的正向哈希值算出来存进一个巨大的数据库彩虹表。输入e10adc3949ba59abbe56b057f20f883e它只是在数据库里查到了对应的 123456。如果原始内容足够复杂比如是“今天天气真好且包含特殊字符”那个数据库里没有它就永远解不出来。三、核心结论哈希绝不用于“还原内容”。哈希只三两件事1. 唯一性校验文件没变过。2. 身份比对输入的密码哈希后是否和库里的一致。3. 快速定位用于哈希表、数据库索引、负载均衡哈希函数是“粉碎机”而不是“保险柜”。保险柜加密有钥匙可以反向打开粉碎机哈希把文件搅成纸屑永远无法拼回原样。只能通过把另一份文件也搅碎对比纸屑的花纹哈希值是否相同来确认“这两份原件是不是一模一样”。四、文章快速回顾文章至此。