下記の暗号化技術に関する記事の続きです。
今回は一方向ハッシュ関数について説明します。
一方向ハッシュ関数とは
伝送されたデータが改ざんされていないことを確認するための暗号技術です。
一方向ハッシュ関数は、入力として渡されたデータからハッシュ値という値を出力します。
ハッシュ値とは伝送データから指紋のようなもので、伝送データと同時に通信相手に送ります。
上記の図のように、伝送データとハッシュ値を受け取った通信相手は、伝送データからハッシュ値を再度計算し、送られてきたハッシュ値と比較します。そして、計算したハッシュ値と送られてきたハッシュ値が同じになれば、データは改竄されていないことになります。
このようにして、一方向ハッシュ関数とハッシュ値を改ざんの検知に使用します。
一方向ハッシュ関数の性質
一方向ハッシュ関数によって出力されるハッシュ値は下記の性質を持つ必要があります。
- あるデータAから出力されたハッシュ値は、他のデータから出力されたハッシュ値と同じ値にならない(衝突耐性)
- 衝突耐性がないとハッシュ値を偽装できる可能性があり、伝送データが改ざんされていないことの証明ができないため
- 一方向ハッシュ関数に渡されるデータのサイズ、中身によって、出力されるハッシュ値が変わらない
- ハッシュ値から入力データへの逆変換はできない(元データの推測はできない)
一方向ハッシュ関数の種類
ここからは、一方向ハッシュ関数の種類についてそれぞれ説明していきます。
ここで説明するもの以外にも、MD4,MD5(メッセージダイジェスト)というものもあるのですが、衝突耐性に問題があり非推奨とされているため、割愛しています。
SHA-1
160bitのハッシュ値を算出する一方向ハッシュ関数です。
使用されていることも多いですが、2005年、SHA-1に対する効果的な攻撃法が発見されています。互換性維持を目的とする場合以外は使用するのを推奨されておらず、SHA-1使用者にはSHA-2への移行を推奨されています。
SHA-256, SHA-384, SHA-512 (SHA-2)
256,384,512ビットのハッシュ値を算出する一方向ハッシュ関数(SHA-256は256ビット、SHA-384は384ビット、SHA-512は512ビット)です。
CRYPTREC暗号リストでは、電子政府推奨暗号リストにSHA-2が掲載されており、使用が推奨されていると言ってもよいかもしれません。
ただ、ハッシュ値のビット数が少ないと、酷似した誤った文章を作成し、ハッシュ値が同じものを見つけ出される可能性が上がるので注意が必要です。できるだけ、SHA-512のようにビット数が長いものを使用したほうが安全です。
RIPEMD
ブロックチェーン、ビットコインなどでよく利用されている一方向ハッシュ関数です
RIPEMD-128、RIPEMD-160、RIPEMD-256、RIPEMD-320という種類があり、末尾についている数字が算出されるハッシュ値のビット数となります。RIPEMD-160がよく使われています。
SHA-3
コンペによる選定で選ばれた一方向ハッシュ関数です。SHA-2とはアルゴリズムが違い、KECCAKというアルゴリズムが使われています。
クリーンな構成で、多様なデバイスにも対応するため、組み込み用途にも適しています。SHA3-224、SHA3-256、SHA3-384、SHA3-512の四種類があります。
KECCAKについてはGitHubに、KECCAKツールというソフトウェアも公開されています。ここで詳しい説明は割愛しますが、時間があれば別記事でまとめてみたいと思います。
参考文献
- 暗号技術入門 秘密の国のアリス(書籍)
https://cr.hyuki.net/