パスワード・ハッシュの仕組みをわかりやすく解説!【絶対わかる】

セキュリティ

「ハッシュ」とは、一言でいうと「暗号化は簡単だけど復号化は難しい仕組み」のことです。
ハッシュは色々なことに利用されますが、今回は「パスワードを安全に保管するためのハッシュ」についてまとめていきたいと思います。

とりあえず実物を見た方がてっとり早い!実際にパスワードをハッシュ化してみよう

ハッシュを生成するには、「ハッシュ関数」というものを使用します。

試しに「password」という単語でハッシュ値を1つ生成してみました。

5f4dcc3b5aa765d61d8327deb882cf99

これがハッシュ値です。
ハッシュ値そのものは、ランダムな英数字の羅列ですね。
英数字の羅列は指定した単語によって変化します。
上記の羅列は「password」という単語から生成された羅列ですが、他の単語を指定すると全く異なる英数字の羅列が生成されます。

そしてここがキモなのですが、ハッシュは
「password」という単語から「5f4dcc3b5aa765d61d8327deb882cf99」を生成することが出来ますが
「5f4dcc3b5aa765d61d8327deb882cf99」から「password」を生成することは出来ません。

「password」という単語を知らない人が、「5f4dcc3b5aa765d61d8327deb882cf99」という英数字の羅列を生成することは(事実上)不可能なのです。
こういう一方向にだけ変換できる仕組みのことを、専門用語で「非可逆」と呼んだりします。ハッシュは非可逆な暗号化なのです。

データベースには、「5f4dcc3b5aa765d61d8327deb882cf99」の方を保存しておきます。
ログインの際は、パスワード入力フォームに入力された単語をハッシュ化し「5f4dcc3b5aa765d61d8327deb882cf99」と一致するかどうかでログイン合否を判断します。「password」という単語を入力すれば「5f4dcc3b5aa765d61d8327deb882cf99」と一致するはずですし、それ以外の単語を入力すれば別のハッシュ値が生成されるので一致しないはずです。

パスワードのハッシュ化をざっくり説明するとそんな感じです。

余談その1:ハッシュ値は「レインボーテーブル」で複合化できる?

上記で書いた方法は、実はオススメできません。安全とは言い難い方法だからです。
「レインボーテーブル」という、単語+ハッシュ値の組合せを大量に保管したデータベースを作ってしまった人がおりまして
「5f4dcc3b5aa765d61d8327deb882cf99」から「password」という単語を割り出せるようになってしまったのです。

とはいえ、絶対に誰にも思いつかない単語・・・
たとえば「ringoga1kotomikanga3koawasete4kodahohoinohoi(りんごが1個とみかんが3個あわせて4個だホホイのホイ)」のような単語であれば、さすがにレインボーテーブルにも登録されていないでしょうから、上記の方法でも安全にパスワードを暗号化できるでしょう。

ですが今は、他にもっと安全に暗号化できる仕組みがありますので
そちらを使うことをオススメします。

余談その2:ハッシュは「暗号化」ではない?

上記で散々「パスワードをハッシュで暗号化!」という言葉を使用していますが、正確にはハッシュは「暗号化する」とは言わないようです。
暗号化というのは、鍵を使って復号化できるものの事をいいます。
ハッシュは複合化はできないようになっていますので、暗号化の技術からは外れてしまうんだそうです。
ハッシュは暗号化ではなく「置換」の部類に入るそうです。

余談その3:パスワードをハッシュさせておけば、絶対に安全なのか?

「んじゃとりあえずパスワードはハッシュ化して保管しておけば安全なんだね?」

・・・というと、実はそうでもないのです。

ハッシュ化(暗号化)されたパスワードが漏洩したら、たとえハッシュ化されていても解読は容易というのが実際のところです。残念ながら。

ハッシュはあくまで「パスワードがバレにくくなる」「パスワードが盗まれるまでの時間を稼ぐ」というものであり、パーフェクトに完全な対策ではないということを頭に入れておいてください。

なぜ安全でないのかというと、たとえばブルートフォース攻撃(総当たり攻撃)があります。
ブルートフォース攻撃とは、「aaaaa」「aaaab」「aaaac」・・・という感じで総当たりでパスワードを1つずつ調べていく方法なのですが
時間はかかるものの、いずれどこかのタイミングでパスワードが一致しますので、ログインが出来てしまうのです。
パスワードが一致してしまった(バレてしまった)時点でハッシュは意味をなさないですね。

ちなみに上記で使用した「password」という単語ですが、高スペックマシンでブルートフォース攻撃を行えば約7秒でパスワードがバレるそうです。(笑)

参考:セキュリティレポート|第3回:そのパスワードで大丈夫? ~ GPGPUによる高速パスワード解析「ハッシュ化されたパスワードの解析速度」

ハッシュのいろんなアルゴリズム

「ハッシュのアルゴリズム」は、実はいっぱい存在します。
アルゴリズムというのは、計算方法のことだと考えてもらえばOKです。ちなみに上記の例は、すべて「MD5」というアルゴリズムを使用しています。

MD5

有名なハッシュアルゴリズム。1992年に作られたアルゴリズムで、結構古い。
すでに弱点も発見されているので、これのみを単体で使用するのはオススメできません。

CRC32

データチェックを目的としたアルゴリズム。送ったデータが破損していないかどうかを確認するために使われているらしいです。
実装が簡単。分析も容易。検出精度も高い。

SHA-1

SHAシリーズというアルゴリズムの中の1つ。SHAシリーズの中ではSHA-1が一番よく使われています。
かつてはいろいろなシステムに使われていましたが、2017年2月についに突破されてしまいました・・・。
よって現在では使用してはいけないアルゴリズムの1つです。

SHA-3 (SHA256?)

一応SHAシリーズではありますが、SHA-2までとは作りが大きく異なっているのでもはや別物といえるでしょう。
高セキュリティなアルゴリズムです。

PBKDF2

推薦されているアルゴリズムの1つ。(2018年現在)
ハッシュ関数を何千回と繰り返しかけることで強力に暗号化し、それにより解読までの時間を稼ぎます。

随時追加予定!


Category
9WEB