投稿日:2024/11/22 最終更新日:2024/11/22
bcryptを使用したパスワードのハッシュ化についてまとめた
bcrypt(ビー・クリプト)とは
パスワードをハッシュ化するための方法の一つ。
OpenBSDやLINUXディストリビューションなどのシステムで使用されている。
bcrypt以外にはMD5 、SHA-256 、SHA-512などが有名どころ。
特徴
・ハッシュ化された文字列には接頭辞に「$2a$」や「$2b$」が付けられている
・その後に続く数字(10など)はストレッチング回数で生成したハッシュを再度ハッシュするための回数
・その後の22文字はハッシュ化に使用する文字列で「ソルト」と呼ばれる(ランダム生成される)
・最後の31文字がパスワードとソルトをハッシュ化したハッシュ値
例
test0000 をbcryptでハッシュ化した場合
$2a$10$cLTn0IBEF.e9/7HTWuMjweWHxh1E.CMMUtT7goXaEqQYncBFGh1FK
安全性が高い理由
任意の回数分再ハッシュが出来る
ストレッチング回数には任意の数値を入れることでその回数分、再ハッシュを行うことができる。
仕組みとしては「2^n(n=ストレッチング回数)」であり、n=10であれば1024回ハッシュ化を行う。
なので、たとえ逆算ができる状況になってしまったとしても、試行回数が多くなる分手間もかなり掛かるためパスワード解読には時間がかかることになる。
ただ、ストレッチング回数が多いほどサーバー負荷も増えるため、状況に合った回数が望ましい。
ソルトを使用しているから
ソルトは上記の通り、パスワードにランダムな文字列を加えてハッシュ化された値のことだが、ソルトを入れることでレインボーテーブル攻撃の良い対処策となる。
レインボーテーブル攻撃はハッシュ化されたデータの入っているデータベースを利用して逆算することで行う攻撃を指すが、この場合はソルト込みのデータを利用しなければならず、かなりの手間がかかる。
ソルトが漏れてしまった場合でもストレッチング回数で指定された回数分ハッシュ化を繰り返すため、逆算に必要な時間がその分増え、面倒くさい手間を攻撃者にかけさせることができる。
ただ、パスワード自体もかなり想像しにくい文字列を設定することは前提。
実際に使ってみる
①インストール
npm install bcrypt
②ハッシュ値を作成する
const bcrypt = require('bcrypt');
const hashData = bcrypt.hashSync('testHash0000', 10);
console.log(hashData);
実行すると「$2b$10$〜」の形式でハッシュ値が生成される。
実行をする度にソルトが変更されるため注意が必要。
まとめ
調べた感じbcryptを選択することは個人的に今後アリかと思います。
サーバー負荷などを考えると多様は望ましくないため、他のハッシュセキュリティを踏まえ適切な選択が必要にはなるかと思いますが、、