【Node.js】在哈希化中的盐值

“盐散列(Salt Hash)是什么。”

“盐哈希”是在对密码等机密信息进行哈希化时添加随机字符串以增加机密信息解密难度的数据。哈希盐使得即使机密信息被盗取,攻击者也难以猜测出正确的机密信息。

如果需要对密码进行哈希加密的话,先将密码和哈希盐值结合成一个字符串,然后将该字符串作为输入放入哈希函数中,最终生成一个哈希值。通过这种方式,即使是相同的密码,也会生成不同的哈希值,因此即使知道了哈希值,也很难从中恢复出原始密码。

スクリーンショット 2023-04-19 10.24.22.png

使用Node.js进行盐哈希

const crypto = require('crypto');

// ランダムな16バイトのソルトを生成する
const salt = crypto.randomBytes(16).toString('hex');

// ソルト化するパスワード
const password = 'password123';

// パスワードとソルトを結合する
const saltedPassword = password + salt;

// SHA256ハッシュ関数を使用して、ソルトとパスワードを混ぜ合わせてハッシュ化する
const hashedPassword = crypto.createHash('sha256').update(saltedPassword).digest('hex');

console.log('ソルト:', salt);
console.log('ソルト化されたパスワード:', saltedPassword);
console.log('ソルト化されたパスワードのハッシュ値:', hashedPassword);

在上述示例中,使用crypto.randomBytes()方法生成一个随机的16字节的盐。接下来,将密码和盐结合在一起,形成一个新的字符串。然后,使用SHA256哈希函数对新字符串进行哈希化,以获取最终的盐处理密码的哈希值。

需要注意的是,在验证密码时需要使用相同的盐值,因此必须将生成的盐值存储在数据库中等地方。在验证密码时,需要将用户输入的密码与保存的盐值进行组合,并使用相同的哈希算法和盐值进行哈希化。

以下是一个验证密码的示例。

// データベースから取得した保存されたパスワードのハッシュ値とソルト
const storedHashedPassword = 'c684b07e9d69ef37f1352c78b8c590b17beaa1f85b44d176fbb79c9b66fb786d';
const storedSalt = 'b25c508e97486ccf62c1d26177d4f4f3';

// ユーザーが入力したパスワード
const userPassword = 'password123';

// ユーザーが入力したパスワードとソルトを結合する
const userSaltedPassword = userPassword + storedSalt;

// SHA256ハッシュ関数を使用して、ソルトとパスワードを混ぜ合わせてハッシュ化する
const userHashedPassword = crypto.createHash('sha256').update(userSaltedPassword).digest('hex');

// ユーザーが入力したパスワードを照合する
if (userHashedPassword === storedHashedPassword) {
  console.log('一致する');
} else {
  console.log('一致しない');
}

广告
将在 10 秒后关闭
bannerAds