密码哈希+盐如何工作

时间:2014-02-20 18:03:35

标签: node.js hash salt bcrypt

我虽然理解哈希和盐渍密码,但似乎我有一些误解。我正在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);

2 个答案:

答案 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到我们的字符串("我的密码" ),我们将更改已启动的字符串并且从不接受 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或参数。