我曾经以为自己理解了密码哈希和盐的概念,但现在似乎有一些误解。我正在使用nodejs创建一个网站用户账户系统。
按照我的理解,当用户创建一个密码时,我们会生成一个随机的盐值,将其附加到密码上,再对这个字符串进行哈希处理。我们还可以添加一个工作因素来使哈希处理变慢,并防御暴力攻击。我们将盐值和哈希值一起存储在数据库中,为了验证登录尝试,我们需要在服务器端重复以上过程,使用存储的盐值和尝试的密码进行检查,看看哈希值是否匹配。
然而,看来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);