bcryptとは?
認証で使用するパスワードを安全にハッシュ化するアルゴリズムです。ハッシュと聞くとSHA256がよく使われていそうですが、パスワードのハッシュ化に関してはSHA256は安全ではないみたいです。
自分がセキュリティに関して詳しくないのでうまく説明できませんが、ハッシュというのは簡単に何回も計算できるからハイスペックなPCを使えば簡単に突破できるよということみたいです。この問題点をbcryptは解決してくれるみたいですね。
Hash関数アルゴリズムは(元々高速に計算することを意図していたのもあり)非常に高速に計算が可能であり、総当たり試行されてしまえば、現代のコンピュータスペックをもってすれば一瞬で解読されてしまいます。また、レインボーテーブルと呼ばれる、高速にHashから元の値を類推することが可能なアルゴリズムも存在し、Hash化では不足です。
参考:BCryptのすすめ
bcrypt詳細
bcryptは60文字のハッシュ値を生成します。このハッシュ値の中には次の4つの情報が含まれます。
- bcryptのバージョン
- ストレッチング回数(ハッシュ化の回数で、2のn乗のnのことで4~31を指定できる)
- ソルト値
- ハッシュ値
例えば下記ハッシュ値の場合を4つに分けると表のようになります。
$2a$10$E5J7SFVBbzynwgKPazA69uNN9lpn6zHq5om6a51FuoTqxo9KsxQHG
要素 | 実際の文字列 | 範囲 |
バージョン情報 | $2 | 最初の$の後 |
ストレッチング回数 | $10 | 2番目の$の後 |
ソルト値 | $E5J7SFVBbzynwgKPazA69 | 3番目の$の後 |
実際のハッシュ値 | uNN9lpn6zHq5om6a51FuoTqxo9KsxQHG | 30文字目から最後まで |
バージョン情報、ストレッチ回数、ソルト回数が入っていて何がいいのかというと、途中からbcryptのバージョンとストレッチング回数を上げても全く問題ないし、ソルト値もDBの別カラムで管理しないでいいのが楽でいいですよね。
サーバーのスペックがより安価に手に入るようになったら今よりもストレッチング回数を上げてよりセキュアなハッシュ値にすることが簡単にできます。
npmモジュールとしてインストールできる
Node.jsから扱う場合はnpmモジュールとして実装されているものがあるのでそれを使うのが一番楽で扱いも簡単でした。そのままbcryptというものでした。githubはこちら。
npm install --save bcrypt
扱い方
非同期と同期方法の二つがありますが、非同期で扱う必要がないと思うので同期での扱い方がオススメです。
var bcrypt = require('bcrypt'); const saltRounds = 10; //ストレッチング回数 const myPlaintextPassword = 'thisispassword'; // これが一番楽 var hash = bcrypt.hashSync(myPlaintextPassword, saltRounds); // ソルト値を自分で生成してハッシュ値を求める方法もある var salt = bcrypt.genSaltSync(saltRounds); var hash = bcrypt.hashSync(myPlaintextPassword, salt);
ストレッチング回数は何回ハッシュ化を行うか決める回数です。これは2のn乗のnの値を決めることになります。
ハッシュ値の比較方法はこちら。簡単ですね。
bcrypt.compareSync('thisispassword', hash); // true bcrypt.compareSync('thisiswrongpassword', hash); // false
まとめ
bcryptはパスワードのハッシュ化によく使われるので使い方を覚えておきましょう。bcryptの仕組みについては下記にまとめたのでぜひ読んでみてください。
関連記事:Spring Securityで使われているBCryptPasswordEncoderの仕組み
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す