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