29

问题是同一个标题,$2x$ 在 BCrypt 中用在哪里?

下面的场景对吗?

$2a$当服务器 PHP 版本较早时,我们已经有一组带有前缀哈希的密码5.3.7。现在我们将 PHP 升级到5.3.7+,现在我们必须首先用$2x$算法验证以前的密码,然后用$2y$前缀重新哈希密码。这是正确的?

4

1 回答 1

95

BCrypt 变种

$2$

BCrypt 是由 OpenBSD 人设计的。它旨在散列密码以存储在 OpenBSD 密码文件中。散列密码与前缀一起存储,以识别所使用的算法。BCrypt 得到了前缀$2$

这与其他算法前缀形成对比:

  • $1$: MD5
  • $3$: NTHASH
  • $5$: SHA-256
  • $6$: SHA-512
  • $7$: 加密

$2a$

最初的 BCrypt 规范没有定义如何处理非 ASCII 字符,或者如何处理空终止符。对规范进行了修订,以指定在散列字符串时:

  • 字符串必须是 UTF-8 编码的
  • 必须包含空终止符

$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,他们可以将版本标记更改为他们想要的任何内容。

2a2x2y2b之间没有区别。如果你正确地编写了你的​​实现,它们都会输出相同的结果。

如果您从一开始就做正确的事(将字符串存储在 utf8 中并散列空终止符),那么: 22a2x2y2b之间没有区别。如果你正确地编写了你的​​实现,它们都会输出相同的结果。

唯一需要关心 2x 和 2y 的人是那些你可能一直在使用crypt_blowfish的人。唯一需要关心2b的人是那些可能一直在运行 OpenBSD 的人。

所有其他正确的实现都是相同且正确的。

于 2016-03-25T17:54:27.710 回答