ハッシュ関数の仕組みについて簡単に説明してみた

アルゴリズムを勉強していて、ハッシュ関数の仕組みについて出てきたので忘れないように!

ハッシュ関数とは

与えられたデータを、固定長の不規則な値に変換する関数のこと

abc -> [ハッシュ関数] -> 7f0579bc2d

上記の例のように、abcという文字をハッシュ関数に通すと、7f0579bc2dという不規則な値を得ることができる。この不規則な値のことをハッシュ値と言います。
ハッシュ値は、16進数で表されることが多いです。

ハッシュ関数は、ミキサーみたいな役割ですね。

入力値をぐちゃぐちゃにして(実際はきちんとアルゴリズムがある)ぐちゃぐちゃになった値を出力するといった感じです。

特徴

ハッシュ関数には、様々な特徴があります。

1. 出力されるデータ長が変わらない

どんな長さの文字列を入れても、出力されるデータの長さは変わりません。

  • abc -> [ハッシュ関数] -> 7f0579bc2d
  • sfrv845hnnbfd -> [ハッシュ関数] -> 4f07fa9e12

 

2. 同じ入力値なら結果は同じになる

上記の通りです。同じ文字・数字なら同じハッシュ値を得ます。

  • abc -> [ハッシュ関数] -> 7f0579bc2d
  • abc -> [ハッシュ関数] -> 7f0579bc2d

3. 本当に低確率で衝突が起こる

昔から問題視されていることです。

下の例のように、全く違う入力値でも、得られるハッシュ値が同じになってしまう確率が0%ではないです。

このようなことを、「ハッシュ値の衝突」と呼びます。下のアルゴリズムの項目で詳しくみて行きます。

  • abc -> [ハッシュ関数] -> 7f0579bc2d
  • 3errb -> [ハッシュ関数] -> 7f0579bc2d

 

4. ハッシュ値から元のデータを得ることは不可能

これもこの通りで、暗号・復号のようにハッシュ値から元の文を生成することはできません。

  • 7f0579bc2d -> [ハッシュ関数] -> abc

これはできない❌

利用例

ユーザーが入力したパスワードをサーバに保存する場合も、ハッシュ関数が使われています。

パスワードをそのまま保存すると、第三者が盗み見する可能性があります。

ユーザーがパスワードを入力すると、入力したパスワードのハッシュ値と、DBに保存されている、ハッシュ値を比較します。

 

アルゴリズム

ハッシュ関数といって、様々なハッシュ関数が存在します。代表的なもので、MD5, SHA-1, SHA-2です。

MD5やSHA-1は情弱性が指摘されて、使うことは推奨されていません。

その例として、2017年にGoogleがSHA-1のハッシュ値衝突に成功してます。現在では、SHA-2がよく利用されているようです。

GoogleとCWI、SHA-1衝突に成功、ハッシュ値が同じ2つのPDFを公開 -INTERNET Watch

SHA-1

160ビットの値を生成するハッシュ関数。以前までは、よく採用されていました。

 

SHA-2

前規格であるSHA-1を元に、多くの改良が加えられたハッシュ関数。
SHA-2にはSHA-224SHA-256SHA-384SHA-512の4つのバリエーションがあり、末尾の数字がハッシュ値のビット長を表している。
もっとも安全なのは、SHA-512です。もっともよく使われているのは、SHA-256

 

まとめ

GoogleがSHA-1を衝突させるコードを公開しているようなので、実際にやってみたいと思います。

コメントを残す

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

CAPTCHA