我只是想知道最大长度是多少。我从Wikipedia读到它需要一条长度小于 2^256 位的消息。这是否意味着 2 的 256 次方?另外,多次散列密码会更安全吗?例子:
WHIRLPOOL(WHIRLPOOL(WHIRLPOOL(WHIRLPOOL("passw0rd"))))
还是会增加碰撞的风险?
我只是想知道最大长度是多少。我从Wikipedia读到它需要一条长度小于 2^256 位的消息。这是否意味着 2 的 256 次方?另外,多次散列密码会更安全吗?例子:
WHIRLPOOL(WHIRLPOOL(WHIRLPOOL(WHIRLPOOL("passw0rd"))))
还是会增加碰撞的风险?
是的,这确实意味着 2^256 位。当然,由于一个字节中有 2^3 位,因此您将拥有 2^253 字节的最大空间。没什么好担心的。
是的,最好多次散列。不,您不必担心“循环”(很多)。许多伪随机数生成器以相同的方式使用哈希。散列算法不应该丢失太多信息并且不应该有很短的循环时间。
然而,密码哈希应该使用基于密码的密钥派生函数来计算。然后存储“密钥”。PBKDF 可以使用散列(例如 PBKDF2)或密钥块密码(bcrypt)。大多数 KDF 使用消息验证码(HMAC 或 MAC),而不是直接使用底层散列算法或分组密码。
PBKDF 的输入是盐和迭代计数。迭代计数用于使攻击者更难通过尝试各种密码来暴力破解系统。这与您在上面使用 WHIRLPOOL 所做的基本相同。只有迭代计数通常在 1 到10,000之间。在每次迭代中通常也会混入更多数据。
更重要的是,(特定于密码的)盐用于确保无法检测到重复密码并避免使用彩虹表进行攻击。通常盐是大约 64 到 128 位。盐和迭代计数应与“哈希”一起存储。
最后,使用 NIST 审查过的哈希算法(例如 SHA-512)而不是 WHIRLPOOL 可能会更好。