ファイナンス、情報通信技術のスキル・アグリゲーション・サイト

' . iseeit.jp 情報通信技術 . '
 
暗号と通信 ③

ハッシュと署名は、何が違うのか
誰が検証でき、誰に証明できるか

ハッシュ、HMAC、電子署名。 どれも「改ざんを検知する」と説明されます。 しかし答えられる問いが違います—— この文書は変わったか。正しい相手からのものか。 誰が作ったか、第三者に示せるか。

SHA-256 HMAC 電子署名 改ざん検知

[ 1 ]

同じ説明をされる、3つのもの

ハッシュも HMAC も電子署名も、たいてい「改ざん検知に使う」と説明されます。 間違いではありませんが、それだけではどれを使うべきか判断できません

違いは、検証する側から見て何が分かるかにあります。 3つの問いを立てると、はっきりします。

検証者が答えられる問い
ハッシュ
HMAC
署名
この文書は、途中で変わったか?
正しい相手が作ったものか?
誰が作ったか、第三者に示せるか?

段階的に、できることが増えていきます。 そのぶん必要なもの(鍵の管理)も増えます。順に見ていきます。

前提

暗号化そのものについては 暗号化アルゴリズム体験デモで AES と RSA を扱いました。この記事は「秘密にする」ではなく「確かめる」ための仕組みです。

[ 2 ]

ハッシュ — 誰でも計算できる

任意の長さのデータから、決まった長さの値を作ります。 SHA-256 なら、どんなデータでも 256ビット(16進で64文字)になります。

SHA-256
振込先: 1234567 山田太郎 / 金額: 10000円
→ a259c67fb5e156b7904ed971447305999d0d602c0ffa5ac20dfb9885e62f676c

// 金額の 1 を 9 に変える
振込先: 1234567 山田太郎 / 金額: 90000円
→ 42ef5c7c3081083225c287bcd3a217e0405d2823c0f8ba001695a653f2d59cdf

1文字変えただけで、256ビットのうち127ビット(約50%)が変わりましたわずかな違いが全体に波及する——雪崩効果と呼ばれます。

ハッシュに求められる性質

同じ入力からは必ず同じ値が出る。値から元のデータを復元できない同じ値になる別のデータを見つけられない。この3つです。

できること、できないこと

用途なぜ使えるか
ダウンロードの検証転送中に壊れていないか確かめられる
重複の検出同じ内容かどうかを短い値で比較できる
パスワードの保存元に戻せないので、漏れても直接は使えない
ただし、鍵がありません。 ハッシュは誰でも計算できます。 だから「この値を作れるのは誰か」を絞り込めません。 文書とハッシュがセットで届いたとき、 両方とも正しい送り主が作ったのかは分からない

ハッシュが確実に守れるのは、偶然の破損です。 通信エラーやディスクの不良で内容が変わったことは、確実に分かります。

だからハッシュは、別の手段と組み合わせて使われます。 配布サイトのハッシュ値が意味を持つのは、 その値自体が HTTPS で守られたページに載っているからです。 ハッシュ単体ではなく、信頼できる経路で伝えられた値との比較に意味があります。
[ 3 ]

HMAC — 鍵を知る者だけが作れる

ハッシュに鍵を混ぜて計算します。 同じ文書でも、鍵が違えば別の値になります。

HMAC-SHA256(同じ文書・違う鍵)
// 鍵 A で計算19f68cff55b72f8aaf4835dcc612ef487c126de19d93075fa025f34c413fecce

// 鍵 B で計算6a65f1a6cff39bee7bd6905027297ea2...

鍵を知らなければ、正しい値を作ることも、検証することもできません。 これで「正しい相手が作ったものか」に答えられるようになります。

TLS の通信では、これが使われています。 前々回触れた AES-GCM の認証タグは、MAC(メッセージ認証符号)の一種です。 通信を始める時点で鍵を共有済みなので、 これで足ります。

できないこと — 第三者への証明

鍵は2者で共有しています。つまり、 どちらも同じ値を作れます

否認の問題

受け取った側が「この文書は相手が送ってきた」と主張しても、 自分で作った可能性が排除できません。 同じ鍵を持っているのだから、区別がつかない。 送信者は「私は送っていない」と言えてしまいます

2者の間で完結する用途なら問題ありません。 サーバーが自分で発行した Cookie を、自分で検証する—— このような場合、第三者に示す必要がないからです

[ 4 ]

電子署名 — 作れるのは1人、検証は誰でも

鍵を2つに分けます。秘密鍵と公開鍵です。

持つ人できること
秘密鍵本人だけ署名を作る
公開鍵誰でも署名を検証する

作れるのは秘密鍵の持ち主だけ。しかし検証は誰でもできます。 この非対称性が、HMAC との決定的な違いです。

ECDSA P-256 での検証
正しい文書 + 正しい公開鍵     → 検証成功
改ざんされた文書              → 検証失敗
別人の公開鍵で検証            → 検証失敗
だから証明書には署名が使われます。 前回扱った証明書は、 認証局(CA)が署名したものです。 CA の公開鍵はブラウザに組み込まれており、誰でも検証できる。 HMAC では、この使い方はできません。 全員と鍵を共有することになってしまうからです。
[ 5 ]

デモ:3つを、同じ文書に適用する

文書を書き換えると、3つとも検証に失敗します。 そのうえで、鍵を変えたときの違いを見てください。

Interactive · integrity check
検証者の立場で確かめる
Web Crypto API(SHA-256 / HMAC / ECDSA P-256)で実際に計算します。入力はブラウザ内で処理され、送信されません。
文書(送信側が作成し、3つの値を添付した)

「鍵を変える」を押すと、HMAC と署名だけが検証に失敗します。 ハッシュは鍵を使わないので、影響を受けません。 この違いが、3つの性質の差そのものです。

[ 6 ]

どこで、どれが使われているか

場面使われるもの理由
配布ファイルの検証ハッシュ破損の検知で足りる。値はHTTPSで伝える
パスワードの保存ハッシュ元に戻せないことが目的
TLS の通信MAC(認証タグ)鍵は接続時に共有済み
API の認証HMAC双方が鍵を持つ。第三者は関与しない
Cookie の改ざん防止HMACサーバーが自分で検証できればよい
サーバー証明書署名誰でも検証でき、CAが作ったと示せる
ソフトウェアの配布署名開発元が作ったと、利用者全員が確認できる
選び方は単純です。 検証する人が限られているなら HMAC不特定多数が検証する必要があるなら署名。 鍵を配れる範囲が、そのまま判断の基準になります。
[ 7 ]

署名でも、防げないこと

署名が証明するのは、「この秘密鍵で作られた」ということだけです。

秘密鍵が盗まれれば、正当な署名が作れてしまいます。 署名の仕組みは、鍵の持ち主が誰かを知りません。 鍵を持っている者が本人かどうかは、 署名の外側で担保する必要があります

だから証明書があります。「この公開鍵は、このドメインの持ち主のものだ」という 対応づけを、認証局が保証する。 以前書いたとおり、 それもドメインの持ち主であることまでしか保証しません。

鍵が漏れた場合に備えて、失効の仕組みも用意されています。 CRL(失効リスト)や OCSP(オンラインでの状態確認)といったものです。 この検証がどこまで実際に行われているかは、別の主題になります。

[ 8 ]

まとめ

この記事のまとめ

  • 3つとも改ざんを検知するが、答えられる問いが違う
  • ハッシュは誰でも計算できる。守れるのは偶然の破損。値自体を安全に伝える必要がある。
  • 1文字変えると256ビット中127ビットが変わる(雪崩効果)。
  • HMAC は鍵を知る者だけが作れる。なりすましを防げる。
  • ただし鍵を共有した2者はどちらも同じ値を作れる。第三者に証明できない。
  • 署名は秘密鍵で作り、公開鍵で検証する。作成者を特定でき、誰でも検証できる。
  • 選び方は「誰が検証するか」。限られた相手なら HMAC、不特定多数なら署名。
  • 署名が示すのは「この鍵で作られた」ことだけ。鍵の持ち主が本人かは証明書の役目。

関連記事