为什么即使没有 salt 参数,散列比较输出也为真?
Why does the hash compare outputs true even without the salt parameter?
我使用 bcrypt-nodejs
在我的 node.js 应用程序中生成哈希,就像这样:
var complete_string = "login" + "user@gmail.com";
var salt = "89Uhfdsua8aHK";
var hash = bcrypt.hashSync(complete_string, salt);
然后我尝试使用以下方法检查该字符串的哈希值是否正确:
bcrypt.compareSync(complete_string, hash)); // true
但为什么 compareSync
函数会输出 true
,即使我没有给它任何 salt
参数?
如果您检查 hash
,您会注意到 hashSync()
将盐添加到输出中:
const bcrypt = require('bcrypt-nodejs');
const complete_string = "login" + "user@gmail.com";
const salt = bcrypt.genSaltSync(2);
console.log("salt: " + salt);
const hash = bcrypt.hashSync(complete_string, salt);
console.log("hash: " + hash);
console.log("compare: " + bcrypt.compareSync(complete_string, hash));
输出:
salt: a$k/a9i/zMGnzx5VKjmhXySO
hash: a$k/a9i/zMGnzx5VKjmhXySO.sx6fcIPsdbej1pVVcKLy9TbNK.2aLm
compare: true
正是出于这个原因,将盐与散列值一起存储是很常见的,这样以后就可以验证散列,而不必将盐作为单独的值传递。 bcrypt 库恰好为你做这件事。
我使用 bcrypt-nodejs
在我的 node.js 应用程序中生成哈希,就像这样:
var complete_string = "login" + "user@gmail.com";
var salt = "89Uhfdsua8aHK";
var hash = bcrypt.hashSync(complete_string, salt);
然后我尝试使用以下方法检查该字符串的哈希值是否正确:
bcrypt.compareSync(complete_string, hash)); // true
但为什么 compareSync
函数会输出 true
,即使我没有给它任何 salt
参数?
如果您检查 hash
,您会注意到 hashSync()
将盐添加到输出中:
const bcrypt = require('bcrypt-nodejs');
const complete_string = "login" + "user@gmail.com";
const salt = bcrypt.genSaltSync(2);
console.log("salt: " + salt);
const hash = bcrypt.hashSync(complete_string, salt);
console.log("hash: " + hash);
console.log("compare: " + bcrypt.compareSync(complete_string, hash));
输出:
salt: a$k/a9i/zMGnzx5VKjmhXySO
hash: a$k/a9i/zMGnzx5VKjmhXySO.sx6fcIPsdbej1pVVcKLy9TbNK.2aLm
compare: true
正是出于这个原因,将盐与散列值一起存储是很常见的,这样以后就可以验证散列,而不必将盐作为单独的值传递。 bcrypt 库恰好为你做这件事。