通过 Google 和 SO 挖掘可以找到一些资源,但它们似乎是相互冲突且不完整的。
所以我的问题是:
python-bcrypt 中哈希值前面的 $2a$ 有什么意义?
我专门使用http://www.mindrot.org/projects/py-bcrypt/上的实现,但问题普遍适用。
此外,最好澄清一下它是否可以在 python-bcrypt 模块中配置?如果确实存在安全问题,需要您使用特定的、不同的实现。
这$2a$是正在使用的算法的指示符。
在OpenBSD密码文件中,有许多存储密码的标准。每个密码都以算法标识符为前缀。
$1$:MD5哈希$2$:bcrypt 哈希$5$:SHA2-256 哈希$6$:SHA2-512 哈希当 bcrypt 最初发布时,它的标识符是$2$。
$2$
BCrypt 是由 OpenBSD 人员设计的。它旨在对密码进行哈希处理以存储在 OpenBSD 密码文件中。哈希密码以前缀存储,以识别所使用的算法。BCrypt 的前缀是$2$。
$2a$
最初的 BCrypt 规范没有定义如何处理非 ASCII 字符,或者如何处理空终止符。该规范经过修订,指定在对字符串进行哈希处理时:
$2x$、$2y$ (2011 年 6 月)
在crypt_blowfish(BCrypt 的 PHP 实现)中发现了一个错误。这是对第 8 位设置的字符处理不当。
他们建议系统管理员更新现有的密码数据库,替换$2a$为$2x$,以表明这些哈希值不好(并且需要使用旧的损坏算法)。$2y$他们还提出了让 crypt_blowfish 发出由固定算法生成的哈希值的想法。2x没有其他人,包括规范的 OpenBSD,采用/的想法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 存储字符串并对 null 终止符进行哈希处理),那么: 2、2a、2x、2y和2b之间没有区别。如果您正确编写了实现,它们都会输出相同的结果。
唯一需要关心 2x 和 2y 的人是那些您可能一直在使用crypt_blowfish 的人。唯一需要关心 2b 的人是那些可能一直在运行 OpenBSD 的人。
所有其他正确的实现都是相同且正确的。
| 归档时间: |
|
| 查看次数: |
2226 次 |
| 最近记录: |