哈希函数 是把任意长度的数据转换为固定长度值(哈希·摘要)的函数。相同的输入总是得到相同的哈希,但输入哪怕只相差 1 位,也会产生完全不同的哈希。
优秀的密码学哈希的核心性质是 单向性。仅凭哈希值几乎不可能还原出原始输入。因此,若把密码以哈希而非明文存储,即使数据泄露,也无法立即得知原文。
碰撞 指两个不同的输入拥有相同哈希的情况。理论上它是存在的,但在安全的哈希中,蓄意构造碰撞在计算上应当是不可行的。MD5·SHA-1 之所以被弃用,正是因为已经能够构造出碰撞。
对于密码存储,仅靠哈希是不够的。由于相同的密码会得到相同的哈希,因此要为每个输入加上随机值 盐(salt)后再哈希,并使用 bcrypt·Argon2 这类 慢哈希 来减缓大规模猜测攻击。