BCrypt中使用2x前缀?

时间:2013-03-31 18:53:25

标签: php bcrypt crypt

问题是同一个标题,BCrypt使用$ 2x $?

以下情况是对的?

当服务器PHP版本早于$2a$时,我们已经有一组用5.3.7前缀进行哈希处理的密码。现在我们将PHP升级到5.3.7+,现在我们必须首先使用$2x$算法验证以前的密码,然后使用$2y$前缀重新密码。那是对的吗?

1 个答案:

答案 0 :(得分:56)

  

维基百科编辑注意:此答案中的内容属于公共领域;我知道,因为我写了它。我首先为自己编写了它,然后将它放在Stackoverflow上。我也知道,因为Stackoverflow上的所有东西都是copyleft。即使不是这样,任何人都可以随时随地以任何理由随意使用它。我怎么知道?因为我写了它,我只是这么说。这包括维基百科上的Bcrypt条目。用维基百科的说法:我捐了它。

     

当您不知道自己在说什么时,请停止声明侵犯版权。

BCrypt变体

<强> $ 2 $

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

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

  • $1$:MD5
  • $5$:SHA-256
  • $6$:SHA-512

<强> $ 2A $

原始BCrypt规范没有定义如何处理非ASCII字符,或者如何处理空终止符。修改了规范以指定散列字符串时:

  • 字符串必须是UTF-8编码
  • 必须包含null终结符

$ 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

版本 $ 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的人。

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