JS Twin-Bcrypt盐图案

我一直在探索Twin-Bcrypt JavaScript库,发现一个奇怪的东西。在某一时刻,我在服务器端用PHP base64_encode(openssl_random_pseudo_bytes(16))制作了自己的盐,并在TwinBcrypt.hash()函数中使用它,该函数响应由于库中规则的模式不匹配而导致salt无效。因此,模式是:JS Twin-Bcrypt盐图案

var SALT_PATTERN = /^\$2[ay]\$(0[4-9]|[12][0-9]|3[01])\$[.\/A-Za-z0-9]{21}[.Oeu]/; 

和它看起来罚款我的盐,除了一两件事 - 到底是什么 - [.Oeu]

我的第一个问题是,为什么他们从盐期待与结束,或Ø,或ē,或ü?据我所知openssl_random_pseudo_bytes()生成安全CSPRNG,但由于模式JS库不想接受它。

第二个问题 - 盐是否有任何安全原因以/[.Oeu]/模式结束?

我会非常感谢任何帮助,因为没有多少关于它的信息。

回答:

我不知道bcrypt真的很好,但现在看来,双Bcrypt预计salt参数,包括完整的类型标签(2a/2y/2x),成本参数,实际的加密盐值。 (我相信这是为了符合其他库的期望。)加密salt值只是salt参数字符串的最后22个字符,它们表示128位值。

要真正解决你的问题,你需要做两两件事:

  1. 前缀的盐与$2y$10$,使其有一个类型标签和成本参数。

  2. 将您的PHP base64_encode结果映射到bcrypt的非标准base64值。作为参考,值:

    Standard: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/ 

    bcrypt: ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

    如果你只想做一个标准的base64成brcypt-的base64字符串,可以用.取代所有+,但是这将导致不同的值(因为标准+62,而.0,并且所有其他值也被抵消)。如果您想要一个与原始值相同的brypt字符串,则需要用每个字符替换它的bcrypt。

    您可能还需要从标准字符串中删除尾部=(如果存在)。


的额外信息:为什么必须将盐与[.Oeu]结束?

bcrypt中的salt是128位。每个base64字符传递6位信息。这意味着21个base64字符可以平均传送126位。最后2位必须在最后的第22个字符中编码。由于该字符仅由2位定义,因此它只能有4个可能的值。

当我们检查brypt以base64字符库,我们可以看到:

./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

从零算起,我们看到,这些值将出现在indicies:

. => 0 = 000000 

O => 16 = 010000

e => 32 = 100000

u => 48 = 110000

因此,那些后二位设置最终字符的高端位。

以上是 JS Twin-Bcrypt盐图案 的全部内容, 来源链接: utcz.com/qa/265483.html

回到顶部