パスワードをそのまま送るなんて怖すぎる!HTTP Digest認証で「秘密の合言葉」を守る仕組み
エンジニアとしてネットワークの世界に足を踏み入れると、最初にぶつかる壁の一つが「認証」です。
WebサイトでIDとパスワードを入力する場面、皆さんも毎日目にしますよね?実は、HTTP通信の初期に使われていた「Basic認証」という仕組みでは、パスワードがまるでハガキにそのまま書かれた状態で、郵便局員(ネットワーク機器)全員に見られてしまうような危険な状態でした。
そこで登場したのが、「HTTP Digest認証」です。今日は、この賢い認証の仕組みを、郵便のやり取りに例えて紐解いていきましょう。
—
Basic認証の「恥ずかしすぎる」失敗
まずは比較のために、古い「Basic認証」を例え話にしてみます。
あなたが誰かに手紙を送るとき、封筒に「私のパスワードは『123456』です」と大きく書いて送るようなものです。途中の郵便局員がその手紙を透かして見れば、簡単にあなたの秘密が盗めてしまいますよね。これがBasic認証の弱点です。
これを解決するために、「パスワードそのものを送るのではなく、パスワードを加工した『合言葉』を送ろう!」と考えられたのがDigest認証なんです。
—
Digest認証の「合言葉」を作る仕組み
Digest認証では、サーバーとクライアント(ブラウザ)の間で、以下のようなやり取りが行われます。
1. サーバーから「今日の使い捨てクーポン(Nonce)」が届く
まず、あなたがサーバーに「入りたいです!」と伝えます。するとサーバーは、「Nonce(ナンス)」という、その時限りのランダムな文字列をあなたに送ります。
これは、「今の時間はこれを使って計算してね」という、いわば「今日の合言葉の鍵」です。
2. パスワードとNonceを混ぜて「ハッシュ化」する
あなたは、自分の本当のパスワードと、サーバーからもらったNonceを、特定のレシピ(計算式)で混ぜ合わせます。これを専門用語で「ハッシュ化」と呼びます。
出来上がるのは、元に戻すことができない、全く別の長い文字列です。この「加工された文字列」だけをサーバーに送ります。
3. サーバーが答え合わせをする
サーバーは「あなたが持っているはずのパスワード」と「さっき送ったNonce」を同じ計算式に入れて、計算結果を照らし合わせます。もし結果が一致すれば、「君は正しいパスワードを知っている人だね!」と認められるわけです。
—
なぜこれで安全なの?(リプレイ攻撃対策)
ここからが賢いところです。もし悪い人が、あなたが送った「加工済みの文字列」を盗み見したとします。でも、それを使ってもサーバーには入れません。なぜなら、Nonceは「その時限り」で使い捨てだからです。
郵便で例えるなら、「昨日の合言葉」を盗んでも、今日はもう別の合言葉が必要なので、ドアは開かないということ。これが「リプレイ攻撃(盗んだデータをそのまま再送してなりすます攻撃)」への強力な防御策になっているんです。
—
実践:どんなデータが流れているの?
実際にネットワーク上を流れているやり取りを見てみましょう。サーバーの設定ファイル(例: Apacheなど)でDigest認証を有効にすると、ブラウザは以下のようなヘッダーを送信します。
Authorization: Digest username=”tanaka”,
realm=”my-office-site”,
nonce=”dcd98b7102dd2f0e8b11d0f600bfb0c093″,
uri=”/secret-room”,
response=”6629fae49393a05397450978507c4ef1″
/ responseの部分が、計算後の「加工された合言葉」です /
- username: 誰がログインしようとしているか。
- nonce: サーバーから送られてきた「今日の鍵」。
- response: パスワードとnonceを混ぜて作った、あなたの証明書。
もし悪い人がこのデータを盗んでも、次にアクセスする時には別の `nonce` がサーバーから発行されるため、この `response` は無効になります。非常に理にかなっていますよね。
—
まとめ:一歩ずつ理解すれば怖くない
Digest認証のポイントを3つだけ持ち帰ってください。
1. パスワードそのものは決して送信しない(ハッシュ化して送る)。
2. Nonce(使い捨ての鍵)を使うことで、盗み聞きされても悪用できない。
3. サーバーとクライアントで計算結果を照らし合わせるだけ。
インフラの世界では、こうした「どうすれば秘密を守りつつ、相手を正しく確認できるか」という知恵の積み重ねが、今の安全なインターネットを支えています。
最初は難しく見えるHTTPヘッダーも、こうして背景にある「意図」を考えると、ぐっと身近に感じられるはずです。次回のネットワークデバッグの際、パケットの中にこの `nonce` を見つけたら、「ああ、今ここで安全な握手をしているんだな」と思い出してみてくださいね。
それでは、また次回の技術探検でお会いしましょう!
コメント