哈希(或哈希摘要)是由哈希函数从任意大小的输入数据生成的固定大小字符串。哈希函数是单向数学函数——给定任意输入,您可以立即计算其哈希值,但无法逆转此过程以恢复原始数据。相同的输入始终产生相同的输出,即使单个字符的变化也会导致完全不同的结果。
想要计算字符串或文件的哈希值?
打开哈希生成器 →哈希函数的历史可以追溯到 1953 年,当时 IBM 的 Hans Peter Luhn 描述了用于数据检索的最早哈希概念之一。密码哈希在 1970 年代与公钥密码学一起作为正式学科出现。重要里程碑包括 MD5(1991年,Ron Rivest)、SHA-1 标准(1995年,NSA/NIST)和引入 SHA-256 与 SHA-512 的 SHA-2 家族(2001年,NSA/NIST)。2012 年,NIST 将 SHA-3(Keccak)标准化为具有完全不同内部构造的替代方案。在密码哈希方面,bcrypt(1999年,Niels Provos & David Mazières)引入了故意减慢速度的理念,而 Argon2 在 2015 年赢得密码哈希竞赛,增加了对抗 GPU 攻击的内存硬度。
哈希函数接受任意长度的输入并产生固定长度的输出(摘要)。四个关键属性定义了密码哈希函数:
SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-256("Hello") = 185f8db32921bd46d35b97f9c798b7d00b6c5fb5f0c2c3f0c3f2f1e2d1c0b9a8
SHA-256("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
由 Ron Rivest 于 1991 年设计。产生 128 位(32 个十六进制字符)摘要。MD5 在密码学上已被破解——自 2004 年以来,实际碰撞攻击已被证明,2008 年使用 MD5 碰撞创建了伪造的 SSL 证书。绝不应将其用于安全目的。对于非安全校验和仍可接受(例如,验证文件下载未因传输错误而损坏,而非防篡改)。
MD5("hello") = 5d41402abc4b2a76b9719d911017c592
由 NIST 于 1995 年发布。产生 160 位(40 个十六进制字符)摘要。SHA-1 在所有安全用途中已被弃用——谷歌在 2017 年演示了实际的碰撞攻击(SHAttered)。浏览器和证书颁发机构已停止接受 SHA-1 证书。Git 历史上使用 SHA-1 作为对象 ID(现在正在迁移到 SHA-256)。
SHA-1("hello") = aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
由 NIST 于 2001 年发布。SHA-2 家族是当前大多数密码应用的标准。SHA-256 产生 256 位(64 个十六进制字符)摘要,用于 TLS 证书、比特币挖矿、JWT 签名和代码签名。SHA-512 产生 512 位摘要,在 64 位硬件上处理大型输入时比 SHA-256 更快。
SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-512("hello") = 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
由 NIST 在公开竞赛后于 2015 年标准化。与 SHA-2 的 Merkle–Damgård 构造相比,SHA-3 使用了根本不同的内部构造(海绵函数)。这意味着即使在 SHA-2 中发现了漏洞,SHA-3 也将保持安全。SHA-3 在大多数 CPU 上不比 SHA-2 快,但提供了具有独立安全属性的重要替代方案。
由 Niels Provos 和 David Mazières 于 1999 年专门为密码哈希设计。bcrypt 自动包含随机盐值(防止预计算彩虹表攻击)和可配置的成本因子来控制函数的速度。随着硬件改进,只需增加成本因子即可。bcrypt 输出包含盐值和成本因子,因此哈希值是自包含且可移植的。
bcrypt("password", cost=12) =
$2b$12$EXRkfkdmXn2gzds2SSitu.MW9.TNJjKVvljQQnqPDFT9cNBivgNS2
2015 年密码哈希竞赛的冠军。Argon2 增加了内存硬度——攻击者除了 CPU 时间外,还需要可配置数量的 RAM,这使得 GPU 和 ASIC 暴力破解攻击的成本大幅增加。存在三个变体:Argon2d(抗 GPU)、Argon2i(抗侧信道)和 Argon2id(混合型——适用于大多数用例的推荐选择)。Argon2 是新应用程序的推荐选择。
HMAC(基于哈希的消息认证码)将任何哈希函数与密钥结合起来生成消息认证码。HMAC 验证数据完整性(消息未被篡改)和真实性(只有拥有密钥的人才能生成它)。HMAC-SHA256 用于 JWT HS256 签名、API 请求签名和 Webhook 负载验证。
HMAC-SHA256(key="secret", message="hello") =
88aab3ede8d3adf94d26ab90d3bafd4a2083070c3bcce9c014ee04a443847c0b
哈希(或哈希摘要)是哈希函数从任意大小的输入数据生成的固定大小字符串。哈希函数是单向的——您可以从输入计算哈希,但无法从哈希重建输入。相同的输入始终产生相同的输出。
MD5 产生 128 位摘要,在密码学上已被破解——碰撞攻击已被证明。SHA-256 是 SHA-2 家族的一部分,产生 256 位摘要,在大多数用途上仍然安全。两者都不应单独用于哈希密码;请改用 bcrypt 或 Argon2。
SHA-256 被设计为快速运行,这使得暴力破解变得容易——现代 GPU 每秒可以计算数十亿个 SHA-256 哈希值。bcrypt 和 Argon2 等密码哈希算法故意设计得很慢,并包含随机盐值以防止预计算彩虹表攻击。
两者都是为密码哈希设计的,并包含加盐功能。bcrypt(1999年)有一个可配置的成本因子来控制速度。Argon2(2015年)增加了内存硬度——攻击者除了需要 CPU 时间外,还需要大量 RAM,这使得 GPU 和 ASIC 攻击的成本大幅增加。Argon2id 是新系统的推荐选择。
哈希碰撞是指两个不同的输入产生相同哈希输出的情况。安全的哈希函数使找到这样的碰撞在计算上不可行。MD5 和 SHA-1 已被破解,因为实际碰撞已被证明;SHA-256 和 SHA-3 仍保持碰撞抗性。
HMAC(基于哈希的消息认证码)将哈希函数与密钥结合起来生成消息认证码。它验证数据完整性和真实性。HMAC-SHA256 用于 JWT HS256 签名、API 请求签名和 Webhook 验证。