为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我每次的加密后的密码都不同。就拿密码“b”来说,我每次存进mongodb的密码都是不同的hash,这次为什么啊?对吗?

正在回答

1 回答

这就是加盐的过程,同样的密码,最终生成的 hash 是不同的,具体比对则是通过 bcr


看源码, save 的时候:

bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
    if (err) return next(err)
    bcrypt.hash(user.password, salt, function(err, hash) {
      if (err) return next(err)

      user.password = hash
      next()
    })
  })

首先造盐,拿到一个 salt ,然后混合到 password ,生成最终的 hash,拿 aaabbb 这个原始密码为例,第一次 save 的时候,生成的 salt 和 hash 分别是


$2a$10$qblANrkDqjdO87voGXP66O

$2a$10$qblANrkDqjdO87voGXP66OU9R.vUq8c08ZwPhgEycLpQ1wJ7V7Anm


第二次则是 


$2a$10$5Co.ZwYWLrXofKa4PbnRde

$2a$10$5Co.ZwYWLrXofKa4PbnRdegAd7NpHKAYsvEfJ0bxQjqMGoJEvaBKq


hash 之所以不同就是 由于 盐的不同,这样极大的增强了密码的强度,使得反向破解变得极为困难,但同时注意比对 salt 可以发现,生成的 hash 中就包含了掺进去的 盐,以第二次为例,名词我也不知道如何翻译最佳,把 hash 拆解后:


Format (identifier): 2a

Cost parameter: 10

Salt:  5Co.ZwYWLrXofKa4PbnRde

Hash digest:  gAd7NpHKAYsvEfJ0bxQjqMGoJEvaBKq


至于如何  compare 就交给 bcrypt 去做了,更多了解可以看这个:https://github.com/ademarre/binary-mcf

2 回复 有任何疑惑可以回复我~
#1

Kvkens 提问者

感谢老师的耐心回复,我已经大概了解了加盐!
2014-10-13 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
node建站攻略(二期)——网站升级
  • 参与学习       51940    人
  • 解答问题       408    个

帮助你深入前后端开发留下的迷惑,为进一步自学打下基础

进入课程
意见反馈 帮助中心 APP下载
官方微信