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位值。
要真正解决你的问题,你需要做两两件事:
前缀的盐与
$2y$10$
,使其有一个类型标签和成本参数。将您的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