复制密码由bcrypt哈希

时间:2015-03-23 14:27:09

标签: node.js bcrypt

我使用

之类的东西存储我的密码
var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync('password', salt); //hash = $2a$10$MCNmLPkgiZ9jH9/0x4ZVJOvxYratODHJbcC6.X3vIDoxOfFwBYCpK

我想将我的数据库移动到另一台机器并且BANG!我所有的密码都错了

如果我在新机器中执行相同的代码,我得到一个不同的哈希,这很重要吗?

var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync('password', salt); //hash = $2a$10$LLi4TyJ1oP69HQMkPpsExO4hinwW3SmURR0mqmB1ranCJX3ed5oDC

2 个答案:

答案 0 :(得分:0)

这是设计上的。检查密码的工作流程不涉及生成新盐,仅在检查明文是否正确时使用现有盐。

来自wikipedia on password salts

  

要了解破解单个密码与之间的区别   设置它们,考虑一个包含数百个密码文件的密码文件   用户名和密码。没有盐,攻击者可以计算   hash(attempt [0]),然后检查该哈希是否出现在任何位置   文件。匹配的可能性,即破解其中一个   具有该尝试的密码随着密码的数量而增加   文件。如果存在盐,则攻击者必须这样做   计算哈希(salt [a] .Try [0]),其中“。”表示连接,   比较条目A,然后哈希(盐[b] .Try [0]),比较   反对条目B,依此类推。这在尝试中击败了“重用”哈希   破解多个密码。

答案 1 :(得分:0)

了解变量salt

想象一下,您的数据库将用户X的密码存储为hash('mypass')

Intruder会抓住您的数据库,并获取哈希密码。现在他能够运行Rainbow Attack,如果他预先计算的Rainbow表包含密码'mypass',他将很容易找到用户X使用的密码。

要缓解,您可以将密码存储为hash('mypass' + 'SERVER_CONSTANT') 即使入侵者能够访问'SERVER_CONSTANT',它也完全可以击败彩虹攻击。它现在是必需的标准,称为Salt

bcrypt.genSalt(Sync)方法依赖于服务器硬件的唯一属性生成Salt。 genSalt对于每台计算机都是不同的(否则它会违反Salt的目的)。


解决方案:

旧计算机上的

console.log(bcrypt.genSaltSync(10))。我们说它是ABCDE

然后在新服务器上执行:var salt = 'ABCDE'。使用常量而不是genSalt是安全的,但是你必须将它保密(在公共存储库之外等)。