根据 PHP 的文档,bcrypt salt 是由
“$2a$”,两位数的成本参数,“$”,以及字母表中的 22 位数字“./0-9A-Za-z”
因此,如果我使用 crypt() 函数对我的密码进行哈希处理,则结果输出包括前 7 个字符($2a$10$,如果 10 是成本参数)作为盐的一部分 - 并且根据所有示例我在网上找到了,这个完整的输出被写入db.
我想知道将这些第一个字符与其余的盐和加密数据一起存储有什么意义。它们的含义对我来说完全清楚,但我无法真正理解为什么这些信息应该与散列的其余部分一起写入。它们不是“只是”有关算法和计算的自适应成本的信息吗?那么存储此类应用程序相关信息有什么好处呢?而且(即使听起来很幼稚)为什么要将它们透露给最终可以获取我的数据库的攻击者?
原因是 crypt 的工作原理。它的设计使您可以执行以下操作
if ($hashedPassword == crypt($rawPassword, $hashedPassword)) {
//Verified
}
因此,通过存储所有内容,您不需要每次都重新创建盐字符串......
盐的目的不是保密。事实上,这并不意味着要保密。它的目的是衬托彩虹桌。请记住,如果他们可以获取您的数据库,那么他们也很有可能获得其他东西,因此将盐放在其他地方并不会真正给您带来太多好处。
此外,盐也起不了多大作用。 BCrypt 被设计为 CPU-Hard,这意味着暴力破解(即使知道盐)是不切实际的。这就是为什么你有一个cost范围。所以不用担心“隐藏”盐。只需将其与密码一起存储就可以了...
更不用说如果将来你想调整你的算法会发生什么?例如,假设您希望由于安装更好的硬件而增加成本参数。如果您没有将这些信息与密码一起存储,您存储的所有密码都将变得无效。这样,存储的每个密码都包含验证它所需的所有信息。这样,您可以检查是否有效登录,如果哈希值是当前默认值,如果不是,则重新哈希并使用新哈希值更新数据库。它可以防止与更新和改进哈希方法相关的问题......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)