问题是同一个标题,$2x$ 在 BCrypt 中用在哪里?
下面的场景对吗?
$2a$
当服务器 PHP 版本较早时,我们已经有一组带有前缀哈希的密码5.3.7
。现在我们将 PHP 升级到5.3.7+
,现在我们必须首先用$2x$
算法验证以前的密码,然后用$2y$
前缀重新哈希密码。这是正确的?
$2$
BCrypt 是由 OpenBSD 人设计的。它旨在散列密码以存储在 OpenBSD 密码文件中。散列密码与前缀一起存储,以识别所使用的算法。BCrypt 得到了前缀$2$
。
这与其他算法前缀形成对比:
$1$
: MD5$3$
: NTHASH$5$
: SHA-256$6$
: SHA-512$7$
: 加密$2a$
最初的 BCrypt 规范没有定义如何处理非 ASCII 字符,或者如何处理空终止符。对规范进行了修订,以指定在散列字符串时:
$2x$, $2y$ (2011 年 6 月)
在crypt_blowfish中发现了一个错误, BCrypt 的 PHP 实现。这是第 8 位设置的错误处理字符。
他们建议系统管理员更新他们现有的密码数据库,用 替换$2a$
,$2x$
以表明这些哈希是错误的(并且需要使用旧的损坏算法)。他们还提出了让 crypt_blowfish$2y$
为固定算法生成的哈希值发出的想法。没有其他人,包括规范的 OpenBSD,采用2x
/的想法2y
。此版本标记仅限于 crypt_blowfish.
版本$2x$和$2y$并不比$2a$ “更好”或“更强” 。它们是 BCrypt 的一种特殊错误实现的残余。
$2b$ (2014 年 2 月)
在 BCrypt 的 OpenBSD 实现中发现了一个错误。他们将字符串的长度存储在一个unsigned char
. 如果密码长度超过 255 个字符,它将溢出并在 255 处换行。
BCrypt 是为 OpenBSD 创建的。当他们的库中出现错误时,他们决定修改版本是可以的。这意味着如果您想保持最新的“他们的”规范,其他所有人都需要效仿。
版本$2b$并不比$2a$ “更好”或“更强” 。它是 BCrypt 的一个特殊错误实现的残余。但是由于 BCrypt 规范地属于 OpenBSD,他们可以将版本标记更改为他们想要的任何内容。
2a、2x、2y和2b之间没有区别。如果你正确地编写了你的实现,它们都会输出相同的结果。
如果您从一开始就做正确的事(将字符串存储在 utf8 中并散列空终止符),那么: 2、2a、2x、2y和2b之间没有区别。如果你正确地编写了你的实现,它们都会输出相同的结果。
唯一需要关心 2x 和 2y 的人是那些你可能一直在使用crypt_blowfish的人。唯一需要关心2b的人是那些可能一直在运行 OpenBSD 的人。
所有其他正确的实现都是相同且正确的。