我用这样的方法存储我的密码
var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync('password', salt); //hash = $2a$10$MCNmLPkgiZ9jH9/0x4ZVJOvxYratODHJbcC6.X3vIDoxOfFwBYCpK
我想把我的数据库移到另一台机器上然后砰地一声!我所有的密码都错了
如果我在新机器上执行相同的代码,就会得到不同的哈希,这很重要吗?
var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync('password', salt); //hash = $2a$10$LLi4TyJ1oP69HQMkPpsExO4hinwW3SmURR0mqmB1ranCJX3ed5oDC
发布于 2015-03-23 14:46:32
那是故意的。检查密码的工作流不涉及生成新的salt,只在检查明文是否正确时使用现有salt。
来自维基百科密码盐
要理解破解单个密码和一组密码之间的区别,请考虑一个包含数百个用户名和密码的单一密码文件。如果没有salt,攻击者可以计算哈希(尝试),然后检查该哈希是否出现在文件中的任何位置。匹配的可能性,即使用该尝试破解一个密码,随着文件中密码的数量的增加而增加。如果存在盐类,则攻击者将不得不计算散列(Salta)。(尝试),在哪里“。”表示连接,与条目A进行比较,然后进行散列(Saltb)。与条目B进行比较,以此类推。这击败了试图破解多个密码的“重用”散列。
发布于 2015-03-23 14:51:42
理解变量salt
假设您的数据库将用户X的密码存储为hash('mypass')
。
入侵者得到他的手在你的数据库,并获得哈希密码。现在,他能够运行一个彩虹攻击,如果他的预先计算的彩虹表包含密码'mypass',他将很容易地找到什么密码用户X使用。
为了减轻风险,您可以将密码存储为hash('mypass' + 'SERVER_CONSTANT')
--它完全击败了彩虹攻击,即使入侵者可以访问'SERVER_CONSTANT'
。它现在是一个必需的标准,被称为食盐。
bcrypt.genSalt(Sync)
方法依赖于服务器硬件的独特属性生成盐分。对于每台计算机,genSalt
是不同的(否则它就违背了Salt的目的)。
解决方案:
console.log(bcrypt.genSaltSync(10))
在你的旧机器上。假设它是ABCDE
。
然后在你的新服务器上做:var salt = 'ABCDE'
。使用常量而不是genSalt是安全的,但是您必须将它保持私有(远离公共存储库,等等)。
https://stackoverflow.com/questions/29212791
复制相似问题