在python bcrypt中'$ 2a $'有什么意义?

时间:2013-03-19 19:15:36

标签: python bcrypt

有一些来源可以通过谷歌和挖掘SO,但它们似乎是冲突和不完整。

所以我的问题是:

在python-bcrypt中预先加入$ 2a $哈希的意义是什么?

我专门使用http://www.mindrot.org/projects/py-bcrypt/的实施,但这个问题通常适用。

此外,澄清它是否可以在python-bcrypt模块中配置会很棒?如果事实上存在安全问题,则需要您使用特定的不同实现。

1 个答案:

答案 0 :(得分:1)

$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月)

crypt_blowfish(BCrypt的PHP实现)中发现了一个错误。设置了第8位的字符处理不当。

他们建议系统管理员更新其现有的密码数据库,将$2a$替换为$2x$,以表明这些哈希值是不好的(并且需要使用破旧的算法)。他们还提出了让crypt_blowfish发出$2y$的想法,以解决由固定算法生成的哈希。包括规范的OpenBSD在内的其他任何人都没有采用2x / 2y的想法。 This version marker was was limited to crypt_blowfish

$ 2a $ 相比,版本 $ 2x $ $ 2y $ 并不“更好”或“更强”。它们是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的人。

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