LoginSignup
2
0

More than 3 years have passed since last update.

bcryptでのhash

Last updated at Posted at 2020-11-06

bcryptのhash

非同期でhashを行う。

hash.js
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されたパスワードが出力される
pass
$2b$10$PXGSNfywWeedDsq10zX8vuPXkJQ6ZjqU9HKSjGZ8XnojEwM9lFOky

今回はコンソールに出しているが本来はDBなどに保存して利用する。
saltRoundsは何回hashをするかを2のn乗で指定できる、今回は10に指定しているが現在では10では保守性が低いらしいので実際に使う場合はスペックと相談しつつできる限りしたほうがよい。

ちなみに
salt単体を出力すると、

salt
$2b$10$PXGSNfywWeedDsq10zX8vu

先頭の$2bの部分がbcryptのアルゴリズムを10saltRoundsで指定した数字が入る。
それ以降の数字がsaltということになる。

一致しているかどうかの判断

私が詰まったのはこの部分だ、saltを生成して利用するわけだからsaltを自分で保存するものだと思っていた。saltを別個に保存して参照する時にパスワードに対して同じ処理をして、一致するかどうかを判断ししようと思っていたが、saltはbcryptが生成したものでしか扱えず既にできたsaltを使うことができなかった。
saltはhashしたパスワードと一緒に保存されており、hash前のパスワードとhashした後のパスワードだけで参照ができる機能が存在していた。この仕組みがなかなか公式ドキュメントからはわかりづらく(英語だった影響もあるが)詰まった原因にもなった。

login.js
const bcrypt = require('bcrypt');
const pass = XXXXXXXXXXX;  //hashする前のパスワード
//保存しておいたパスワード
const passHash = $2b$10$PXGSNfywWeedDsq10zX8vuPXkJQ6ZjqU9HKSjGZ8XnojEwM9lFOky;
bcrypt.compareSync(pass, passHash);  //true 

終わりに

今回の記事が初投稿です。おかしな点や解釈違いなどありましたらご指摘お願いいたします。
私は本気でsaltがどこに保存されているのかわからず自分で保存して参照しようとまでしました。
調べている過程で日本語で解説している記事があまり見当たらなかったので(検索が下手なだけかもしれませんが)備忘録として書かせていただきました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0