我虽然理解哈希和盐渍密码,但似乎我有一些误解。我正在nodejs中为我的网站创建一个用户帐户系统。
我理解的方式是,当用户创建密码时,我们生成一个随机盐,将其附加到密码然后散列该字符串。我们还可以添加一个工作因子来使哈希缓慢工作并防御暴力攻击。我们将salt与哈希一起存储在我们的数据库中,并验证登录尝试,我们使用存储的salt和尝试的密码重复上述过程(在服务器上),并检查哈希值是否匹配。
似乎nodejs中的bcrypt
模块与我对散列的解释不一致。这是来自http://codetheory.in/using-the-node-js-bcrypt-module-to-hash-and-safely-store-passwords/
var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync("my password", salt);
首先,为什么工作因素应用于盐而不是哈希?如果有人通过暴力攻击他们会运行哈希函数是否正确?哈希不是我们需要缓慢的函数吗?
我也对bcrypt验证感到困惑:
bcrypt.compareSync("my password", hash);
我们需要哈希是唯一的,即使两个用户选择相同的密码,这是正确的点吗?那我们为什么不这样做?
bcrypt.compareSync("my password"+salt, hash);
答案 0 :(得分:3)
salt
包含轮数,因此bcrypt.hash(Sync)
函数知道它必须完成多少轮。
hash
也不是简单的哈希,而是嵌入了salt
的容器。
答案 1 :(得分:3)
SALT
是2个数的度数(从4到31) - 函数创建散列的迭代循环。 bcrypt
取盐,将盐倍数乘以2。并将此值实现解码功能到我们的字符串总量次数。它是bcrypt函数中循环的" rounder" 。
每次你这样做:
bcrypt.hashSync("my password", salt)
bcrypt
创建新"随机" string,每次使用相同的输入字符串并使用相同的salt
我们采用不同的输出字符串,这是工作bcrypt函数的关键思想,这个总结果我们将保存到我们的基地。
然后我们使用:
bcrypt.compareSync("my password", hash);
并且compareSync
计算是否从字符串"我的密码" 创建了哈希。如果我们在函数compareSync
中添加salt到我们的字符串("我的密码" ),我们将更改已启动的字符串并且从不接受以这种方式em> true
。因为bcrypt
会比较hash
,因为它是以这种方式创建的:
bcrypt.hashSync("my password"+salt, salt);
我们应该采用这种结构:
var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync("my password", salt);
hash
保存到db 登录时的下一步认证用户,如:
bcrypt.compareSync("my password", hash);
没有任何salt
或参数。