Skip to content
shunsei.dev
Go back

「暗号化してからMAC」がなぜ重要か? セキュリティの基本原則を理解する

Edit page

はじめに

暗号理論に秀でよ。これは学べば学ぶほど退屈な代物だ。ただ、HMACしてから暗号化と、暗号化してからHMACの違いがわからないようでは、到底エースセキュリティエンジニアとはいえない。

ロシアの天才ハッカーによる【新人エンジニアサバイバルガイド】 - Qiita
弊社に5年間在籍していたロシアの天才ハッカーが先日退職しました。 ハッキング世界大会優勝の経歴を持ち、テレビ出演の経験もある彼ですが、正直こんなに長く活躍してくれるとは思っていませんでした。彼のようなタレントが入社した場合、得てして日本の大企業にありがちな官僚主義に辟易して...
ロシアの天才ハッカーによる【新人エンジニアサバイバルガイド】 - Qiita favicon qiita.com
ロシアの天才ハッカーによる【新人エンジニアサバイバルガイド】 - Qiita

先日、ある技術ブログを見ていたら、こんな一文を見かけました。 違いがすぐに出てこなかったので、簡単にまとめた記事になります。 一見すると些細な順序の違いに思えますが、実はこの違いがシステムのセキュリティ強度を大きく左右する、非常に重要な原則を突いています。

この記事では、

といった点について、できるだけ分かりやすくまとめました。この原則を理解することで、より堅牢なシステム設計ができるのではないかと思います。

そもそも「HMACする」とは?

本題に入る前に、まずは「HMAC」という言葉の意味をおさらいします。

HMACとは Hash-based Message Authentication Code の略で、日本語では「ハッシュベースのメッセージ認証コード」と呼ばれます。

「HMACする」とは、この技術を使ってメッセージ認証コード(MAC値)を生成することを指します。 その目的は、主に以下の2つです。

  1. データの完全性(Integrity)の検証: データが通信の途中で改ざんされていないかを確認する。
  2. 送信者の認証(Authentication): データが本当に期待される送信者から送られてきたものかを確認する。

HMACは、メッセージ(データ本体)と、送信者と受信者だけが知っている共通鍵という2つの材料から、ハッシュ関数というアルゴリズムを使って固定長の文字列(MAC値)を生成します。

受信者は、受け取ったメッセージと自分たちが持っている共通鍵を使って、同じようにMAC値を計算します。そして、送られてきたMAC値と自分で計算したMAC値がピッタリ一致すれば、「このデータは改ざんされておらず、本物の相手から来たものだ」と判断できるわけです。

簡単に言うと、「HMACする」とはメッセージと秘密の鍵を使って、そのメッセージが本物であり、途中で書き換えられていないことを証明するための『改ざん検知シール』を貼る作業だとイメージしてください。

本題:暗号化とHMACの組み合わせ方

安全な通信を実現するためには、第三者に内容を読み取られないための暗号化(機密性) と、先ほど説明したMAC(完全性・認証) の両方が必要です。

しかし、この2つを組み合わせる際には、適用する順序が非常に重要になります。ここで登場するのが、冒頭で触れた3つの方式です。

  1. MAC-then-Encrypt (MtE): 先にMACを計算し、平文と一緒に暗号化する
  2. Encrypt-and-MAC (E&M): 平文を暗号化し、平文のMACを計算する(それぞれ独立)
  3. Encrypt-then-MAC (EtM): 先に平文を暗号化し、その暗号文に対してMACを計算する

結論から言うと、現在のセキュリティにおけるベストプラクティスは 3. Encrypt-then-MAC (EtM) と思われます。では、なぜ他の方式は推奨されないのでしょうか?

方式1: MAC-then-Encrypt (先にMAC、後で暗号化)

これは、直感的に思いつきやすい方法かもしれません。

リスク: 改ざんされたデータに対して、脆弱性のトリガーになりうる「復号処理」を先に行わなければならない。

方式2: Encrypt-and-MAC (それぞれ独立)

これも一見、問題なさそうに見えるかもしれません。

方式3: Encrypt-then-MAC (先に暗号化、後でMAC) - 推奨される方法

これが、現代の暗号プロトコルにおける標準的なアプローチです。

最大のメリット: 復号というデリケートな処理を行う前に、データの完全性を検証できる。これにより、不正なデータに起因する脆弱性を根本から排除できます。

結論:なぜこの違いが重要なのか

暗号理論に秀でよ。これは学べば学ぶほど退屈な代物だ。ただ、HMACしてから暗号化と、暗号化してからHMACの違いがわからないようでは、到底エースセキュリティエンジニアとはいえない。

冒頭の上記の言葉に戻りましょう。

この言葉の真意は、単に暗号技術やアルゴリズムを知っているだけでなく、それらをどのように組み合わせ、どのような順序で適用すれば最も堅牢になるのかを理解しているかが、真のセキュリティ専門知識の証である、という意味なのかなと思いました。

この差は歴然です。Encrypt-then-MACのアプローチは、TLS 1.3などの現代的なプロトコルでも採用されている、業界標準のベストプラクティスです。

まとめ

最近では、このEncrypt-then-MACの考え方を実装した**認証付き暗号(AEAD: Authenticated Encryption with Associated Data)**という暗号利用モードが主流になっています(例: AES-GCM)。ライブラリ選定の際には、AEADに対応しているかを一つの基準にするのも良いでしょう。

この小さな順序の違いが、システムの安全性を大きく左右する。この原則を忘れずに、日々の開発に活かしていきたいです。


Edit page
Share this post on:

Previous Post
PlaywrightのE2Eテストは攻撃判定されないのか? AWS WAFと共存するための実践的セキュリティ対策
Next Post
SQLインジェクションから脆弱性について考えてみる