暗号化に使うbcryptの概要とNode.jsで扱う方法




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の仕組み

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です