今さら聞けないパスワードのDB保存について【ハッシュ化】

アイキャッチ画像
  • パスワードをデータベースへ保存する時にあるべき姿とは?
  • ハッシュ化とは?
  • ソルトとペッパー、ストレッチングとは?

本記事ではこのような疑問を解決します。

アプリケーション開発において、パスワードの管理は欠かせない事項の1つです。

また、パスワードの流出などが発生すると大きな事故になりかねません。

そんな事故を未然に防ぐためにパスワードのデータベース保存方法が重要になります。

とは言ってもパスワードのDB保存事情って基礎中の基礎みたいな臭いがして今さら聞きづらいですよね・・・

そこで今回はパスワードをデータベースへ保存する際の基礎とTipsについて解説します。

パスワードをデータベースへ保存する時の基礎

そもそもの大前提として、
パスワードをそのままデータベースへ保存することはやってはいけないことです。

なぜなら、データベースの中身を見られたり盗まれたりしたら一瞬でパスワードがバレてしまうからです。

よって、パスワードをデータベースへ保存する時はパスワードを何らかの方法で解読できないように変換する必要があります。

そして、そのパスワードの変換に一般的に用いられるのがパスワードのハッシュ化です。

ハッシュ化とは?

ハッシュ化とは元の文字列(ここではパスワード)からハッシュ値と呼ばれる文字列へ不可逆的に変換することです。

パスワードをハッシュ関数(ハッシュ化を行う関数)に渡して一定のアルゴリズムで生成された文字列(ハッシュ値)に変換します。

同じ文字列を同じハッシュ関数(同じアルゴリズム)に渡せば同じハッシュ値が生成されます。

また、ハッシュ化はよく暗号化と混同されることがありますが、2つは別物です。

暗号化は暗号鍵を用いて元の文字列を復号することができますが、
ハッシュ化は元の文字列を復号することはできません。


つまり、先ほども述べたようにハッシュ化は”不可逆的な”変換なのです。

元の文字列に戻すことができないからこそ、
変換された文字列から元の文字列を逆算することは極めて困難なのです。

なお、ハッシュ関数にはいくつも種類があり、
有名どころとしてはSHA256やSHA512、MD5などがあります。

ハッシュ計算ツールを使うとイメージが湧くのではないでしょうか。

パスワードハッシュ化の利用シーン

パスワードのハッシュ化がもっとも利用されるシーンがWebサイト・アプリへログインする時です。

ログイン機能は世の中のWebサイト・アプリの定番ですよね。

ログインする場合はユーザがパスワードを入力して送信し、
サーバで登録されているパスワードと照合します。

この照合で何が行われているかと言うと、
ユーザが入力したパスワードをハッシュ化し、
データベース内のパスワードハッシュ値と同じかを確かめてログイン可否を判断します。

単なるハッシュ化ではまだ不十分

ここまでの説明で、
パスワードのハッシュ化によりセキュリティレベルを高められることがわかりました。

しかし、パスワードをそのままハッシュ化するだけではセキュリティ的にまだ弱いと言えます。

それはレインボーテーブル攻撃に対処しづらいからです。

レインボーテーブル攻撃とは元の文字列とハッシュ値の対応表を作り、
取得したパスワードのハッシュ値と照合することでパスワードを盗み取る攻撃手法です。

ハッシュ関数は元の文字列が同じであれば同じハッシュ値を生成するため、
例えば文字列:”sample”→ハッシュ値:”5e8ff…29be6”というように
文字列とハッシュ値の対応表を作ることでレインボーテーブル攻撃が可能になります。

そして、レインボーテーブル攻撃などのパスワード攻撃を防ぐためにより高度なハッシュ化のやり方が登場しました。

ソルト

ソルトとはハッシュ値を生成する際に元の文字列と一緒にハッシュ関数へ渡す任意の文字列のことです。

同じ文字列をハッシュ化するにしても異なるソルトを使用することで、
同じ文字列で異なるハッシュ値が生成されます。

例えばパスワードを登録する時にユーザIDをソルトとして使用することで同じパスワードでも異なるハッシュ値を生成することができます。

よって、事前に作られた文字列とハッシュ値の対応表を無効化できたり、
同じパスワードを設定できたりすることが可能です。

また、ソルトはパスワードごとに異なる必要があるため、
その性質からパスワードのハッシュ値と同じデータベースに保存されます。

ペッパー

ソルトの問題点はパスワードのハッシュ値と同じデータベースに保存されるため、
データベースの中身が流出した時にソルトを推測される可能性があるということです。

その問題を解決するのがペッパーです。

ペッパーとはアプリケーション全体で扱う共通の秘密キー(文字列)のことです。

ソルトと異なる点は、
パスワードごとではなくアプリケーション全体で一定の値が使用されること、
データベースとは切り離された場所で保管されること、です。

よって、データベースが漏洩した場合でもパスワードの解読を困難にすることができます。

ストレッチング

ストレッチングとはハッシュ化を繰り返すことを言います。

例えば元の文字列をハッシュ化してできた”ハッシュ値1”を再度ハッシュ化して”ハッシュ値2”を生成するといったようにもとの文字列を解読できないようにすることです。

ストレッチングの回数は多ければ多いほど有効ですが、
その分ハッシュ化の計算コストが増加します。

上記のソルトやペッパーと組み合わせて使うことでセキュリティレベルを高めることができます。

まとめ

以上がパスワードをデータベースへ保存する際の基礎とTipsになります。

パスワードをデータベースへ保存する際はソルトやペッパー、ストレッチングをうまく組み合わせてセキュリティレベルを高めることが大事です。

本記事があなたの開発にお役に立てたら幸いです。