#bcryptのhash
非同期でhashを行う。
const bcrypt = require('bcrypt'); //bcryptの読み込み
const saltRounds = 10; //hashする回数
const pass = XXXXXXXXXXX; //hashしたいパスワード
function passWordHash(pass){
var salt = bcrypt.genSaltSync(saltRounds); //saltを生成している
var passHash = bcrypt.hashSync(pass,salt); //passとsaltを利用してhash
return passHash;
}
console.log(passWordHash(pass)); //hashされたパスワードが出力される
$2b$10$PXGSNfywWeedDsq10zX8vuPXkJQ6ZjqU9HKSjGZ8XnojEwM9lFOky
今回はコンソールに出しているが本来はDBなどに保存して利用する。
saltRoundsは何回hashをするかを2のn乗で指定できる、今回は10に指定しているが現在では10では保守性が低いらしいので実際に使う場合はスペックと相談しつつできる限りしたほうがよい。
ちなみに
salt単体を出力すると、
$2b$10$PXGSNfywWeedDsq10zX8vu
先頭の$2bの部分がbcryptのアルゴリズムを10saltRoundsで指定した数字が入る。
それ以降の数字がsaltということになる。
#一致しているかどうかの判断
私が詰まったのはこの部分だ、saltを生成して利用するわけだからsaltを自分で保存するものだと思っていた。saltを別個に保存して参照する時にパスワードに対して同じ処理をして、一致するかどうかを判断ししようと思っていたが、saltはbcryptが生成したものでしか扱えず既にできたsaltを使うことができなかった。
saltはhashしたパスワードと一緒に保存されており、hash前のパスワードとhashした後のパスワードだけで参照ができる機能が存在していた。この仕組みがなかなか公式ドキュメントからはわかりづらく(英語だった影響もあるが)詰まった原因にもなった。
const bcrypt = require('bcrypt');
const pass = XXXXXXXXXXX; //hashする前のパスワード
//保存しておいたパスワード
const passHash = $2b$10$PXGSNfywWeedDsq10zX8vuPXkJQ6ZjqU9HKSjGZ8XnojEwM9lFOky;
bcrypt.compareSync(pass, passHash); //true
#終わりに
今回の記事が初投稿です。おかしな点や解釈違いなどありましたらご指摘お願いいたします。
私は本気でsaltがどこに保存されているのかわからず自分で保存して参照しようとまでしました。
調べている過程で日本語で解説している記事があまり見当たらなかったので(検索が下手なだけかもしれませんが)備忘録として書かせていただきました。