BCrypt中使用2x前缀?

mso*_*soa 16 php crypt bcrypt

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

以下情况是对的吗?

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

Ian*_*oyd 65

维基百科编辑注意:此答案中的内容属于公共领域; 我知道,因为我写了它.我首先为自己编写了它,然后将它放在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.此版本标记仅限于crypt_blowfish.

$ 2x $$ 2y $的版本不比$ 2a $ "更好"或"更强" .它们是BCrypt的一个特定错误实现的残余.

$ 2b $ (2014年2月)

在BCrypt的OpenBSD实现中发现了一个错误.他们把弦的长度存放在一个unsigned char.如果密码长度超过255个字符,则会溢出并以255换行.

BCrypt是为OpenBSD创建的.当他们库中有错误时,他们决定可以使用该版本.这意味着如果您想要保持最新的"他们的"规范,其他所有人都需要效仿.

版本$ 2b $并不比$ 2a $ "更好"或"更强" .它是BCrypt的一个特定错误实现的残余.但是由于BCrypt规范地属于OpenBSD,他们可以将版本标记更改为他们想要的任何内容.

2a,2x,2y2b之间没有区别.如果您正确编写了实现,它们都会输出相同的结果.

如果你从一开始就做正确的事(存储UTF8串并散列空结束),则:有没有什么区别2,2A,2X,2Y2B.如果您正确编写了实现,它们都会输出相同的结果.

唯一需要关心2x和2y的人是那些你可能一直在使用crypt_blowfish的人.唯一需要关心2b的人是那些可能一直在运行OpenBSD的人.

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

  • 它被截断为 72 个***字节***。名义上,您提供这些字节作为原始文本的 UTF-8 编码,并且*包含*空终止符。但最终,名义实现在 72 *字节*后中断;切断空终止符,甚至切断中间的 utf8 多字节字符。但他们并没有人为地将*字符*的数量限制为71个。从技术上讲,您可以让一个*“字符”*占用超过72个字节(例如“M̡̢̛̖̗̘̙̜̝̞̟̠̀́̂̃̄̅̆̇̉̊̋̌̍̎̏̐̑̒̓̔̕̚”是1个字符,74个字节. 是1个字符,但是4个字节)。 (2认同)
  • 还有他们实际存储字符串的方式。在体面的语言中,一个 *string* 具有内部长度前缀并以 null 结尾。较小的语言没有实际的“字符串”类型,因此它们将其伪造为指向 CHAR 的指针,并且还可以附带长度。在这种情况下,他们的字符串类型错误,使用 UInt8 而不是 UInt32 作为长度前缀。如果 C 和 C++ 最终能做正确的事情并添加“字符串”类型,那么一切都将得到解决。但此时,语言维护者出于恶意拒绝添加**字符串**和**数组**。 (2认同)