ハッシュ関数の概要を整理する

皆さん、こんにちは。技術開発グループのn-ozawanです。
今週末は品川で東京食肉市場まつりがありますね。肉食べます。

本題です。
暗号通信では、そのデータが改ざんされていないか判断したいときがあります。2つのデータを差分比較すれば改ざんされたデータかどうかを判断できますが、判断する側が本物のデータを持っている必要があり、実用的ではありません。この時に利用されるのがハッシュ関数です。

ハッシュ関数

概要

ハッシュ関数は任意な長さのデータから、固有の固定長データを生成します。この固定長データをハッシュ値とも言います。

ハッシュ関数には冪等性があり、インプットとなるデータが同じであれば、必ず同じ結果(ハッシュ値)が出力されます。また、インプットとなるデータが1bitでも異なれば、出力されるハッシュ値は全く別の値になるのも特徴です。これらの特徴から、ハッシュ値はそのデータの指紋である、と例えられます。

主な使い方

アリスはボブへデータを送信したいと考えています。しかし、送信している途中で何者かにデータを改ざんされるのでは?と不安を持ちます。アリスはデータと一緒にハッシュ値をボブへ送信することを考えました。

アリスはボブへ送信するデータに対してハッシュ値を生成します。そして、ボブにデータとハッシュ値の両方を送信します。

ボブはアリスから受信したデータからハッシュ値を生成します。そして、アリスが生成したハッシュ値と、ボブが生成したハッシュ値を比較して、一致すれば、アリスから受信したデータは改ざんされていないと判断することが出来ます。

ハッシュ関数の性質

ハッシュ関数で担保したい品質は「完全性(integrity) 」です。完全性とは、データに不正にアクセスおよび改ざんされないこと、です。特にハッシュ関数は「改ざんされないこと」を担保する技術です。暗号化技術のカテゴリなので、共通鍵暗号方式や公開鍵暗号方式のように機密性(第3者から内容を読み取られないこと)があるように思われますが、ハッシュ関数に機密性はありません。

改ざんを阻止するため、ハッシュ関数は、異なるデータから同じハッシュ値が生成されないことが重要視されます。この同じハッシュ値が生成されないことを「衝突耐性」と呼びます。

また、ハッシュ値から、元のデータを復元することが出来ない性質から、「一方向ハッシュ関数」とも呼ばれています。

ハッシュ関数の問題点

公開鍵暗号方式でも同様の問題がありましたが、ハッシュ関数でも同じように、なりすましによる問題が解消されていません。このなりすまし問題を解消するには「デジタル署名」や「証明書」などの技術が必要となります。ハッシュ関数だけではなりすまし問題を解消することは出来ませんが、「デジタル署名」や「証明書」などの技術ではハッシュ関数を利用しているため、間接的には解消に関与していると言えるかもしれません。

ハッシュ関数の種類

ハッシュ関数には以下があります。昔よく見かけたMD5は脆弱性などにより非推奨となっています。また、SHA-1に関しても衝突攻撃の成功が示されており、現在では非推奨となっています。現在、SSL証明書などではSHA-2が主流となっています。

種類 ハッシュ値の長さ(bit) ブロック長(bit) ラウンド数 電子政府における調達のために参照すべき暗号のリスト
MD5 128 512 64 非推奨
SHA-1 160 512 80 運用監視暗号リスト※に挙げられています。
※非推奨だが、互換性維持などにより継続利用を容認するもの。
SHA-2 SHA-224 224 512 64 非推奨
SHA-256 256 電子政府推奨暗号リストに挙げられています。
SHA-384 384 1024 80 同上
SHA-512 512 同上
SHA-512/224 224 非推奨
SHA-512/256 256 電子政府推奨暗号リストに挙げられています。
SHA-3 SHA3-224 224 1600 24 非推奨
SHA3-256 256 電子政府推奨暗号リストに挙げられています。
SHA3-384 384 同上
SHA3-512 512 同上
SHAKE128 (可変長) 同上
SHAKE256 (可変長) 同上

おわりに

今回はハッシュ関数の概要についてはお話ししました。前置きながくなりましたので、今回はここで終わりとして、次回はSHA-256の仕組みをお話ししたいと思います。

ではまた。

採用情報

「チームアイオス」入団者募集

〜就活で悩むアナタに来て欲しい〜