ハッシュ関数は、いかなる長さのデータを入力しても固定長の擬似乱数データを出力する関数です。任意のデータをハッシュ関数にかけることで、別の(多くの場合は短い固定長の)値を得ることができます。
ハッシュ関数により出力されるデータをハッシュ値またはメッセージダイジェスト(要約)と言います。また、入力データをハッシュ関数の出力データに変換することをハッシュ化すると表現します。
ハッシュ化は不可逆変換で、ハッシュ値からハッシュ化前の入力データを算出することはできません。
ハッシュ値の衝突
ハッシュ関数は異なる入力データに対して同じ出力データ(ハッシュ値)となることがありえます。同じハッシュ値になることを衝突と呼びます。ただし、衝突が起こる確率は極めて低く、気にする必要はないと言えるでしょう。
以下のサイトで衝突が起こる確率を数学的に算出しています。
How hard is it to get a git hash collision?
2017年2月にGoogleとオランダのCWI研究が、SHA-1衝突に成功したと発表しました。その際は、その界隈でちょっとした話題になりました。
より良いハッシュ関数は、出力データ(ハッシュ値)がランダムな値になることと、入力データに対して出力データが予測できないことが必要です。例えば、入力データA、Bに1bitしか違いがないとしても、出力データA’、B’は大きく異なることが望ましいです。予測できてしまう場合、そのハッシュ関数は脆弱と言え、使ってはいけません。
代表的なハッシュ関数
代表的なハッシュ関数を下表にまとめます。
名称 | 暗号強度 | ハッシュ長(bit) | 補足 |
---|---|---|---|
MD5 | 低 | 128 | 脆弱。使ってはいけない |
SHA-1 | 中 | 160 | 脆弱なアルゴリズムとされており非推奨 |
SHA-2 | 高 | 224、256、384、512 | ハッシュ長によりSHA-224、SHA-256、SHA-384、SHA-512とも言う。SHA-224は暗号強度が比較低いため推奨されない |
ハッシュ関数の具体例
各ハッシュ関数の入力データと出力データの対応例は以下サイトから確認できます。出力データが入力データから予測しづらいこと、二つの入力データ間の差が少しであっても出力データの差が大きいことがわかると思います。
下表は「こんにちは」という文字列をハッシュ関数にかけた場合のハッシュ値です。
アルゴリズム | ハッシュ値 | 文字数 |
---|---|---|
MD5 | c0e89a293bd36c7a768e4e9d2c5475a8 | 32文字 |
SHA-1 | 20427a708c3f6f07cf12ab23557982d9e6d23b61 | 40文字 |
SHA-256 | 125aeadf27b0459b8760c13a3d80912dfa8a81a68261906f60d87f4a0268646c | 64文字 |
SHA-512 | bb2b0b573e976d4240fd775e3b0d8c8fcbd058d832fe451214db9d604dc7b3817f0b1b030d27488c96fc0e008228172acdd5e15c26f6543d5f48dc75d8d9a662 | 128文字 |
「こんにちは」という文字列からは予想もつかないまったく別の文字列が生成されていることがわかります。これがハッシュ値です。