4

有一些可以通过 Google 获得并通过 SO 挖掘的资源,但它们似乎相互矛盾且不完整。

所以我的问题是:

在 python-bcrypt 中,附加到哈希值的 $2a$ 的意义是什么?

我专门使用http://www.mindrot.org/projects/py-bcrypt/上的实现,但这个问题普遍适用。

此外,如果它可以在 python-bcrypt 模块中配置,那将是很好的澄清?如果确实存在安全问题,需要您使用特定的、不同的实现。

4

1 回答 1

2

$2a$是正在使用的算法的指标。

在 OpenBSD 密码文件中,有许多存储密码的标准。每个密码都以算法标识符为前缀。

  • $1$: MD5 散列
  • $2$: bcrypt 散列
  • $5$: SHA2-256 散列
  • $6$: SHA2-512 散列

BCrypt 变种

当 bcrypt 最初发布时,它的标识符是$2$.

$2$

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

$2a$

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

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

$2x$, $2y$ (2011 年 6 月)

BCrypt的 PHP 实现 crypt_blowfish 中发现了一个错误。这是第 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 的人。

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

于 2020-08-09T20:40:15.073 回答