存储bcrypt哈希

根据PHP的文档,bcrypt盐是由

“$ 2a $”,一个两位数的成本参数,“$”和字母表中的22位数字“.0-9A-Za-z”

因此,如果我使用crypt()函数对我的密码进行哈希处理,那么生成的输出包含前7个字符($ 2a $ 10 $,如果10是cost参数)作为盐的一部分 - 并且根据所有示例i能够在互联网上找到,这个完整的输出写入数据库。

我想知道将这些第一个字符与盐的其余部分和加密数据一起存储的意义。 他们的含义对我来说是完全清楚的,但我不明白为什么这些信息应该与其余的散列一起写。 他们不是“只是”关于算法和计算的适应性成本的信息吗? 那么存储这种与应用程序相关的信息有什么好处? 而且(即使听起来可能幼稚)为什么要将它们泄露给最终能够抓取我的数据库的攻击者?


原因是因为地下室的工作原理。 它的设计使您可以执行以下操作

if ($hashedPassword == crypt($rawPassword, $hashedPassword)) {
    //Verified
}

因此,通过存储所有内容,您不需要每次重新创建盐串...

盐的一点不是保密的。 事实上,这并不意味着保密。 这意味着箔彩虹表。 记住,如果他们能抓住你的数据库,那么他们可以获得其他东西的机会很高,所以把盐放在其他地方并不会给你太多。

此外,盐不会有太大的帮助。 BCrypt被设计为CPU-Hard,这意味着暴力(即使知道盐)是不切实际的。 这就是为什么你有一个成本参数。 所以不要担心“隐藏”盐。 只需将它与密码一起存储,你就会好起来的...

更不用说,如果将来你想调整算法会发生什么? 例如,假设您想增加成本参数,因为安装了更好的硬件。 如果您未将此信息与密码一起存储,则您存储的所有密码都将失效。 这样,每个存储的密码都有验证它的所有必要信息。 这样,如果哈希是当前的默认值,并且如果不重新哈希并使用新哈希来更新数据库,则可以检查有效的登录。 它可以防止与更新和改进哈希方法相关的问题...

链接地址: http://www.djcxy.com/p/28929.html

上一篇: Storing bcrypt hashes

下一篇: is there a way to reverse a hash without rainbow tables?