非同期の bcrypt 関数を利用する方法
ここでは bcrypt の非同期型の関数を利用する例を示します。
同期型の関数呼び出しについては、「同期型の bcrypt 関数を利用する方法」をみてください。
ソルトを生成する genSalt関数、ハッシュを生成する hash 関数はそれぞれ Promise を返すので次のように then で数珠つなぎにできます。
const bcrypt = require('bcrypt');
const saltRounds = 10;
const password = 'Password123';
console.log('START');
console.time('A');
bcrypt
.genSalt(saltRounds)
.then(salt => {
console.log(`salt = [${salt}]`);
return bcrypt.hash(password, salt);
})
.then(hash => {
console.log(`hash = [${hash}]`);
console.timeEnd('A');
})
.catch(error => {
console.log(`error = [${error}]`);
});
console.log('END');
これを実行すると、次のようになりました。
START END salt = [$2b$10$6aAFFnJNQ5OHpWEEqHOtaO] hash = [$2b$10$6aAFFnJNQ5OHpWEEqHOtaOl6FX3L0wjOZcizKKCAzR1g4mTjJnqHy] A: 76.754ms
先に START と END が出力されているので、 コード全体はブロックせずに下まで実行されていることがわかります。
その後、salt の出力、hash の出力が続いています。ハッシュの文字列の前半はソルトです。先頭の $2b$ はハッシュアルゴリズムの識別用のプレフィックスです。
その次の $10$ はハッシュラウンドです。
ここでは console.time と console.timeEnd を使って、 ラベル 'A' 間の経過時間を出力しています。
計算時間が短くなりすぎないように、ハッシュラウンドの数値をあげて調整します。
次の方法ではソルト生成とハッシュの生成を一度に実施しています。
const bcrypt = require('bcrypt');
const saltRounds = 10;
const password = 'Password123';
console.log('START');
console.time('A');
bcrypt
bcrypt.hash(password, saltRounds)
.then(hash => {
console.log(`hash = [${hash}]`);
console.timeEnd('A');
})
.catch(error => {
console.log(`error = [${error}]`);
});
console.log('END');
生成されたハッシュを用いてパスワードの検証を行うには次のように compare を使います。 やはりこれも、Promise を返すので then で結果を受けます。
const bcrypt = require('bcrypt');
const hash = '$2b$10$CW9OqVEHzLLd/RNKJ02zBu9fMytwQGNLjNWa90WuJHL0kOhIwBfDm';
const password = 'Password123';
console.log('START');
console.time('A');
bcrypt
.compare(password, hash)
.then(res => {
console.log(`res=[${res}]`);
console.timeEnd('A');
})
.catch(error => {
console.log(`error=[${error}]`);
});
console.log('END');
以上、ここでは bcrypt の非同期関数を使って、ハッシュの生成とハッシュとパスワードの検証を行う方法を紹介しました。