我使用
之类的东西存储我的密码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
答案 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是安全的,但是你必须将它保密(在公共存储库之外等)。