我一直在探索Twin JavaScript库,发现了一件奇怪的事情。有一次,我用PHP在服务器端制作了自己的salt,并在base64_encode(openssl_random_pseudo_bytes(16))
函数中使用了它,该函数响应说,由于库中的常规模式不匹配,salt是无效的。因此,模式是:
var SALT_PATTERN = /^\$2[ay]\$(0[4-9]|[12][0-9]|3[01])\$[.\/A-Za-z0-9]{21}[.Oeu]/;
我的盐看上去不错,除了一件事--这是什么鬼东西-- [.Oeu]
我的第一个问题是,为什么他们期望盐的结尾是一个点,或O,e,或u?据我所知,openssl_random_pseudo_bytes()
生成安全的CSPRNG,但是由于模式JS库不想接受它。
第二个问题--是否存在以/[.Oeu]/
模式结束salt的安全原因?
我将非常感谢任何帮助,因为这方面没有太多的信息。
发布于 2015-02-23 13:54:52
我不太了解bcrypt,但是Twin似乎希望salt
参数包括完整的类型标记salt
成本参数,以及实际的加密盐值。(我相信这样做是为了满足其他图书馆的期望。)加密盐值仅是salt
参数字符串的最后22个字符,表示128位值。
要真正解决问题,您需要做两件事:
$2y$10$
,以便它有一个类型标签和一个成本参数。base64_encode
结果映射到bcrypt的非标准base64值。供参考的价值如下:
标准: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ bcrypt:./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
如果您只是想将一个标准的base64变成brcypt 64字符串,您可以用.
替换所有的+
,但是这将导致一个不同的值(因为标准+
是一个62
,而.
是一个0
,所有其他值都被抵消了)。如果您想要一个与原始字符串值相同的brypt字符串,则需要将每个字符替换为其bcrypt等效的字符。
您还可能需要从标准字符串(如果存在的话)中消除尾随=
。[.Oeu]
**?**附加信息:为什么盐必须以结束
bcrypt中的盐是128位。每个base64字符传送6位信息。这意味着21个base64字符可以平均传输126个比特。最后的2位必须在最后的第22字符中编码。由于该字符仅由2位定义,因此它只能有4个可能的值。
当我们检查base64字符池中的brypt时,我们会看到:
./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
从零算起,我们看到这些值出现在指数中:
. => 0 = 000000
O => 16 = 010000
e => 32 = 100000
u => 48 = 110000
因此,最后两位正在设置最终字符的高端位。
https://stackoverflow.com/questions/28674246
复制相似问题