BCrypt变体
$2$
BCrypt由OpenBSD团队设计。它旨在为OpenBSD密码文件中存储的密码哈希。哈希密码存储时会使用前缀来标识所使用的算法。BCrypt的前缀是$2$
。
这与其他算法前缀形成对比:
$1$
: MD5
$3$
: NTHASH
$5$
: SHA-256
$6$
: SHA-512
$7$
: scrypt
$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月)
在OpenBSD实现的BCrypt中发现了一个错误。他们将字符串的长度存储在
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的人。
所有其他正确的实现都是相同和正确的。
PHP 5.3.7-
中使用$2a$
哈希加密的密码无法与PHP 5.3.7+
中的$2x$
进行验证。 - msoaPHP 5.3.7-
上使用$2a$
哈希的密码,并想要将PHP更新到5.3.7+
时,我们必须在升级后使用$2x$
验证旧密码。因此,仅使用$2x$
是完全相同的。如果有人认为我犯了错误,请告诉我。谢谢。 - msoa