我一直在探索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
复制相似问题