概要
Web通信やアプリケーションで使われる実用暗号標準について、AES、ハッシュ関数、メッセージ認証、AEAD、TLSを中心に説明する。
現代の暗号利用では、暗号化だけでなく、改ざん検知、認証、鍵交換を組み合わせて安全性を保つ。
DESの限界を受けてAESが標準化され、TLSやAEADのような実用的な組み合わせが広く使われるようになった。
この記事で扱うこと
- AESがDESの後継として重要になった理由。
- CBC、CTR、GCMなどの利用モードの考え方。
- ハッシュ関数、HMAC、KDF、パスワードハッシュの役割。
- AEADが暗号化と改ざん検知を同時に扱う理由。
- TLSが、公開鍵暗号と共通鍵暗号を組み合わせる仕組み。
現代の共通鍵暗号として使われるAES
- DESの後継標準
AES(Advanced Encryption Standard)は、DESの後継として標準化された共通鍵ブロック暗号となる。
AESは128ビットのブロックを扱い、鍵長として128ビット、192ビット、256ビットを使える。
現在でも、ファイル暗号化、VPN、TLS、ストレージ暗号化など、多くの場面で使われている。 - Rijndael
AESは、Rijndaelというブロック暗号をもとに標準化された。
DESのような古い鍵長の問題を避けるため、より長い鍵と現代的な設計を持つ。
ただし、AESそのものが強くても、利用モードや鍵管理を誤ると安全性は下がる。
ブロック暗号の利用モード
- なぜ利用モードが必要か
ブロック暗号は固定長のブロックを変換するため、そのまま長いデータ全体を安全に扱うには工夫が必要になる。
同じ平文ブロックを同じ鍵で暗号化すると同じ暗号文になるような使い方は避ける必要がある。
そこで、CBC、CTR、GCMなどの利用モードが使われる。 - 代表的な利用モード
モード 特徴 注意点 CBC 前の暗号文ブロックを次の処理に使う。 初期化ベクトルとパディング検証に注意が必要。 CTR カウンタから鍵ストリームを作る。 同じ鍵とnonceの再利用を避ける。 GCM 暗号化と認証タグを組み合わせる。 nonceの再利用が危険。
ハッシュ関数とメッセージ認証
- ハッシュ関数
ハッシュ関数は、入力データから固定長の値を作る関数となる。
同じ入力からは同じハッシュ値が得られるが、ハッシュ値から元の入力を戻すことは難しい。
ファイルの改ざん検知、署名対象データの要約、パスワード保存の前処理など、多くの用途で使われる。 - SHA-1からSHA-2、SHA-3へ
古いハッシュ関数であるMD5やSHA-1は、衝突攻撃の問題により、新しい用途では避けるべきものになった。
現在は、SHA-256などのSHA-2系列や、SHA-3系列を使うのが基本となる。
ハッシュ関数も暗号方式と同じように、古い方式を使い続けないことが重要になる。 - HMACとKDF
HMACは、秘密鍵とハッシュ関数を組み合わせてメッセージ認証を行う仕組みとなる。
KDF(Key Derivation Function)は、共有秘密やパスワードなどから、用途に合わせた鍵を導出する仕組みとなる。
鍵交換で得た共有値をそのまま使うのではなく、KDFでセッション鍵へ変換することが多い。
AEAD
- 暗号化と認証をまとめる
AEAD(Authenticated Encryption with Associated Data)は、暗号化と改ざん検知をまとめて扱う考え方となる。
AEADでは、平文を暗号文に変換するだけでなく、認証タグを作る。
受信側はタグを検証し、改ざんがあれば復号結果を信用しない。AEADは、入力と出力を分けると役割が見えやすい。
分類 データ 扱い 入力 鍵、nonce、平文 暗号文を作るために使う。 入力 AAD 暗号化しないが、改ざん検知には含める。 出力 暗号文 平文を隠した結果。 出力 認証タグ 改ざんされていないか確認するための値。 - AAD
AAD(Associated Data)は、暗号化はしないが改ざん検知には含めるデータとなる。
例えば、通信ヘッダの一部は隠す必要がないが、勝手に変更されると困る場合がある。
このようなデータをAADとして扱うことで、暗号文と一緒に完全性を確認できる。
TLSとHTTPS
- TLSの役割
TLSは、通信相手の確認、鍵交換、暗号化、改ざん検知をまとめて扱うプロトコルとなる。
Webサイトで使われるHTTPSは、HTTP通信をTLSで保護したものと考えると分かりやすい。
TLSでは、証明書でサーバーを確認し、鍵交換によってセッション鍵を作り、その後の通信を共通鍵暗号で守る。TLSの流れを単純化すると、次のようになる。
- サーバー証明書で通信相手を確認する。
- 鍵交換でセッション鍵を作る。
- 以後のHTTP通信を、セッション鍵とAEADで保護する。
段階 目的 証明書の確認 接続先が正しいサーバーか確認する。 鍵交換 通信ごとのセッション鍵を作る。 保護された通信 暗号化と改ざん検知を行う。 - TLS 1.3
TLS 1.3では、古い暗号方式や危険な選択肢が整理され、より単純で安全な構成になった。
代表的には、一時鍵を使う鍵交換、AEADの利用、不要な古い方式の削除などが重要になる。
暗号プロトコルでは、個々の暗号アルゴリズムだけでなく、どの順番で何を検証するかが安全性に関わる。
パスワードハッシュ
- パスワードはそのまま保存しない
パスワードを保存するときは、平文のまま保存しない。
パスワードハッシュでは、saltを加え、計算コストを高くすることで、漏えい時の総当たり攻撃を遅くする。
Argon2、bcrypt、scrypt、PBKDF2などは、この目的で使われる代表的な方式となる。 - 通常のハッシュとの違い
通常の高速なハッシュ関数は、ファイル検証などでは便利だが、パスワード保存には速すぎる場合がある。
攻撃者も高速に候補を試せるため、パスワード保存ではあえて計算やメモリを重くする設計が重要になる。
違いを整理する
| 比較する項目 | 整理するポイント |
|---|---|
| 暗号化とハッシュ | 暗号化は復号できる形に変換し、ハッシュは固定長の要約値を作る。 |
| 暗号化と認証 | 暗号化だけでは改ざん検知にならないため、認証タグやMACが必要になる。 |
| 鍵とnonce | 鍵は秘密、nonceは一意性が重要で、秘密である必要はない場合が多い。 |
| TLSとHTTPS | HTTPSはHTTPをTLSで保護した通信として考える。 |
実務とのつながり
- アプリケーション通信
HTTPSを使うことで、通信内容の盗聴や改ざんを防ぎやすくなる。 - API設計
トークン、署名、HMAC、TLS設定などを組み合わせて安全性を考える必要がある。 - 暗号ライブラリ
独自実装ではなく、標準的なライブラリと安全な設定を使うことが重要になる。
まとめ
- AESはDESの後継として広く使われる共通鍵ブロック暗号となる。
- ハッシュ関数、HMAC、KDFは、暗号化とは別の役割を持つ重要な部品となる。
- AEADは、暗号化と改ざん検知をまとめて扱う現代的な方式となる。
- TLSは、公開鍵暗号、共通鍵暗号、証明書、鍵交換を組み合わせて通信を守る。
参考文献
- National Institute of Standards and Technology, FIPS 197, Advanced Encryption Standard(AES)
- RFC 8446, The Transport Layer Security(TLS)Protocol Version 1.3
- RFC 8439, ChaCha20 and Poly1305 for IETF Protocols
- RFC 9106, Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications