有一些可以通过 Google 获得并通过 SO 挖掘的资源,但它们似乎相互矛盾且不完整。
所以我的问题是:
在 python-bcrypt 中,附加到哈希值的 $2a$ 的意义是什么?
我专门使用http://www.mindrot.org/projects/py-bcrypt/上的实现,但这个问题普遍适用。
此外,如果它可以在 python-bcrypt 模块中配置,那将是很好的澄清?如果确实存在安全问题,需要您使用特定的、不同的实现。
有一些可以通过 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 月)
在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,他们可以将版本标记更改为他们想要的任何内容。
2a、2x、2y和2b之间没有区别。如果你正确地编写了你的实现,它们都会输出相同的结果。
如果您从一开始就做正确的事(将字符串存储在 utf8 中并散列空终止符),那么: 2、2a、2x、2y和2b之间没有区别。如果你正确地编写了你的实现,它们都会输出相同的结果。
唯一需要关心 2x 和 2y 的人是那些你可能一直在使用crypt_blowfish的人。唯一需要关心 2b 的人是那些可能一直在运行 OpenBSD 的人。
所有其他正确的实现都是相同且正确的。