首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JS双隐窝盐模式

JS双隐窝盐模式
EN

Stack Overflow用户
提问于 2015-02-23 12:51:27
回答 1查看 237关注 0票数 5

我一直在探索Twin JavaScript库,发现了一件奇怪的事情。有一次,我用PHP在服务器端制作了自己的salt,并在base64_encode(openssl_random_pseudo_bytes(16))函数中使用了它,该函数响应说,由于库中的常规模式不匹配,salt是无效的。因此,模式是:

代码语言:javascript
运行
复制
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的安全原因?

我将非常感谢任何帮助,因为这方面没有太多的信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-23 13:54:52

我不太了解bcrypt,但是Twin似乎希望salt参数包括完整的类型标记salt成本参数,以及实际的加密盐值。(我相信这样做是为了满足其他图书馆的期望。)加密盐值仅是salt参数字符串的最后22个字符,表示128位值。

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

  1. 在salt前加上$2y$10$,以便它有一个类型标签和一个成本参数。
  2. 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时,我们会看到:

代码语言:javascript
运行
复制
./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789

从零算起,我们看到这些值出现在指数中:

代码语言:javascript
运行
复制
. => 0  = 000000
O => 16 = 010000 
e => 32 = 100000
u => 48 = 110000

因此,最后两位正在设置最终字符的高端位。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28674246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档