虽然我理解哈希和盐度密码,但似乎我有一些误解。我正在为nodejs中的我的网站创建一个用户帐户系统。密码哈希+盐如何工作
我理解它的方式是,当用户创建密码时,我们生成一个随机盐,将其附加到密码,然后对该字符串进行哈希处理。我们还可以添加一个工作因子,以使哈希缓慢运行并抵御暴力攻击。我们将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);
盐的主要目标是防止彩虹表攻击,即预先计算的盐到密码的映射,从而降低破解到'originalPassword = rainbowTable [hash]'的复杂度。许多盐甚至更好,但并非所有系统都使用多于一种盐。 – FakeRainBrigand