電子署名とハッシュ
ハッシュ関数とは
ハッシュ関数は、任意の長さのデータを、決まった長さの短い値に変換する計算です。この出力をハッシュ値(ダイジェスト)と呼びます。代表的なものに SHA-256 があります。
- 同じ入力からは必ず同じ出力になり、1文字でも変えると出力が全く別物になる
- 出力から元のデータを復元できない(一方向性)
- 異なるデータが同じ出力になる組み合わせを見つけるのが極めて難しい
| ハッシュ | 暗号化 | |
|---|---|---|
| 元に戻せるか | 戻せない | 鍵があれば戻せる |
| 主な目的 | 改ざん検知・同一性の確認 | 内容の秘匿 |
| 出力の長さ | 常に固定 | 元データに応じて変わる |
暗号化と混同されがちですが、用途は「秘密にする」ではなく「同一性を確かめる」ことです。
電子署名の仕組み
電子署名は、ハッシュと公開鍵暗号を組み合わせて、「改ざんされていないこと」と「誰が作ったか」を同時に証明します。
送信側は、データのハッシュ値を計算し、それを自分の秘密鍵で暗号化したもの(署名)をデータに添えて送ります。受信側は、受け取ったデータから自分でハッシュ値を計算し、署名を送信者の公開鍵で復号して得たハッシュ値と突き合わせます。一致すれば、改ざんなし・送信者本人と確認できます。
[[暗号化の基礎]] の公開鍵暗号とは、鍵の使い方が逆になっている点がポイントです。秘密にするための暗号化は「相手の公開鍵で暗号化」しますが、署名は「自分の秘密鍵で処理」します。秘密鍵を持つのは本人だけなので、本人しか作れない印になるのです。
電子署名が守る3つのこと
署名が保証するのは、完全性(データが途中で改ざんされていない)、認証(確かにその送信者が作った)、否認防止(後から「自分は送っていない」と否定できない)の3つです。
ただし、公開鍵が本当に本人のものかは署名だけでは分かりません。そこを保証するのが [[電子証明書とPKI]] です。署名と証明書はセットで意味を持ちます。
身近な使われどころ
- [[HTTPS・TLS]] — サーバー証明書の検証で署名が使われる
- [[JWT]] — トークンの中身が改ざんされていないことを署名で確認する
- ソフトウェア配布 — インストーラの署名、配布ファイルのハッシュ値の公開、Git のコミット署名
初学者向けポイント
- ダウンロードしたファイルの横に書かれている長い16進数はハッシュ値です。手元で計算して一致すれば、壊れておらず差し替えられてもいないと分かります
- MD5 や SHA-1 は衝突が見つかっており、改ざん検知の用途では非推奨です。現在は SHA-256 以上を使います
- 「署名=内容が秘密になる」ではありません。署名を付けてもデータ自体は読めます。秘匿したいなら暗号化を併用します
- [[パスワードの保存とハッシュ化]] では、総当たり攻撃を遅くするためわざと計算に時間がかかる専用のハッシュ関数を使います。SHA-256 のような高速なハッシュをそのまま流用してはいけません
関連技術とのつながり
- [[暗号化の基礎]] — 公開鍵暗号が署名の土台。鍵の使い方が逆になる
- [[電子証明書とPKI]] — 公開鍵の持ち主を保証し、署名を意味あるものにする
- [[HTTPS・TLS]] — 通信相手の確認に署名検証を使う
- [[パスワードの保存とハッシュ化]] — 同じハッシュでも用途に応じて関数を変える
- [[JWT]] — 署名でトークンの改ざんを検知する
Q: ハッシュ関数の性質として正しいのはどれ?
- [ ] 鍵があれば出力から元のデータに戻せる
- [x] 出力から元のデータを復元できない
- [ ] 入力が長いほど出力も長くなる
解説: ハッシュは一方向で元に戻せず、出力の長さは入力によらず固定です。
Q: 電子署名を作るときに使う鍵はどれ?
- [x] 送信者の秘密鍵
- [ ] 受信者の秘密鍵
- [ ] 受信者の公開鍵
解説: 署名は送信者の秘密鍵で作り、受信者は送信者の公開鍵で検証します。
Q: 電子署名が提供する性質として本文に挙げられているのはどれ?
- [ ] データの内容を秘密にする機密性
- [x] 改ざんされていないことを示す完全性
- [ ] 通信を高速化する圧縮性
解説: 署名が守るのは完全性・認証・否認防止です。内容の秘匿は暗号化の役割です。