はじめに

【9秒チャレンジ】
SIPのHTTPダイジェスト認証は、チャレンジレスポンス方式を用いて通信相手の認証をします。
1. 着信側がランダムなチャレンジ値を発信側に送信。
2. 発信側はパスワードとチャレンジ値でハッシュ値を生成し送信。
3. 着信側も同じハッシュ値を計算し、一致すれば認証成功。
これにより、パスワードを送らず安全に認証できます。
更に詳しく知りたい場合↓
SIPにおけるHTTPダイジェスト認証の仕組み
HTTPダイジェスト認証は、SIP(Session Initiation Protocol)で通信相手を認証するために使用される仕組みです。この認証方式は、以下の特長を持ちます:
- チャレンジレスポンス方式を採用:
パスワードをそのまま送信せずに認証を行うため、盗聴されてもパスワードが漏れにくい仕組みです。 - 認証はSIPサーバーまたは直接ホスト同士で実行可能:
SIPサーバー経由でも、端末同士でも認証が可能です。これは、SIPの柔軟なアーキテクチャによるものです。 - HTTPダイジェスト認証は「MD5ハッシュ」を使用:
ハッシュ値を用いることで、送信データの改ざんや盗聴を防ぎます(ただし、MD5自体には脆弱性があるため、現代では追加のセキュリティ対策が必要になる場合があります)。
SIPでのHTTPダイジェスト認証の手順
1. 初回リクエストの送信(認証情報なし)
発信側(User Agent Client: UAC)は、以下のような認証情報を含まないリクエストを着信側(User Agent Server: UAS)に送信します。
例として、SIPメソッドINVITE
を用いた通信を考えます。
INVITE sip:user@example.com SIP/2.0
From: <sip:caller@example.com>
To: <sip:user@example.com>
Call-ID: 12345abcd
CSeq: 1 INVITE
- このリクエストには、認証情報(Authorizationヘッダー)が含まれていません。

まずは、普通にリクエストを送ります。で、この時は認証されていないので、認証情報が付与されていないリクエストを送ります。
2. チャレンジレスポンスの要求
着信側(UAS)は、認証情報が含まれていないリクエストを受信すると、認証を要求するレスポンスを返します。このレスポンスには以下の情報が含まれています:
- ステータスコード:401 Unauthorized(認証が必要であることを通知)。
- WWW-Authenticateヘッダーにチャレンジ情報を付加:
- realm:認証が有効な領域(例:
example.com
)。 - nonce:一時的なランダム文字列(リプレイ攻撃防止)。
- 認証方式(この場合はDigest)。
- オプションとして
qop
(Quality of Protection)が付加される場合もある。
- realm:認証が有効な領域(例:
- レスポンス例:
SIP/2.0 401 Unauthorized
WWW-Authenticate: Digest realm="example.com", nonce="abcd1234", algorithm=MD5

とりあえず、認証情報が付与されていないリクエストを受け取ったら、認証を要求するレスポンスを送り返すということです。
3. 認証情報付きリクエストの再送信
発信側(UAC)は、以下の情報を用いてレスポンス値(ハッシュ値)を生成し、新しいリクエストに含めて再送信します:
ハッシュ値の生成(RFC 2617準拠)
A1の計算:
A1 = MD5("username:realm:password")
具体例↓
A1 = MD5("user:example.com:password123")
A2の計算:
A2 = MD5("method:URI")
具体例↓
A2 = MD5("INVITE:sip:user@example.com")
レスポンス値の計算:
response = MD5("A1:nonce:A2")
具体例↓
response = MD5("5ebe2294ecd0e0f08eab7690d2a6ee69:abcd1234:4d186321c1a7f0f354b297e8914ab240")

要するに、パスワードとチャレンジ値を使ってハッシュ値を生成するということ。そして、この生成されたハッシュ値をレスポンス値という。
リクエストに含める認証情報
生成したハッシュ値とユーザー名などをAuthorizationヘッダーに付加して再送信します。
- リクエスト例:
INVITE sip:user@example.com SIP/2.0
Authorization: Digest username="user",
realm="example.com",
nonce="abcd1234",
uri="sip:user@example.com",
response="098f6bcd4621d373cade4e832627b4f6",
algorithm=MD5
4. 認証結果の確認
着信側(UAS)は、受信した認証情報を基にレスポンス値を計算し、送られてきたレスポンス値と比較します。
- 一致する場合:認証成功 → 200 OK を返す。
- 一致しない場合:認証失敗 → 再度401 Unauthorizedなどのエラーを返す。
- レスポンス例(認証成功):
SIP/2.0 200 OK

着呼側も、発信側と同じ流れでレスポンス値を生成する。で、それが一致したら認証成功!
5. 認証成功後の通信
認証が成功すると、発信側(UAC)は以降のリクエストで同じ認証情報(レスポンス値)を使用することで、再認証の手間を省けます。ただし、nonceの有効期限が切れた場合は、再びチャレンジレスポンスが行われます。

認証が成功したら、以降の通信ではリクエストの際は生成したレスポンス値を付与して通信する。
SIPにおけるHTTPダイジェスト認証のメリットと課題
メリット
- 安全性:
パスワードそのものを送信せず、ハッシュ値を用いるため、盗聴されてもパスワードが漏洩しにくい。 - リプレイ攻撃の防止:
nonce(チャレンジ値)を使用することで、過去のレスポンス値の再利用を防止。 - SIPとHTTPの統一性:
SIPがHTTPダイジェスト認証を採用しているため、両方のプロトコルで一貫した認証方式を利用可能。
課題
- MD5の脆弱性:
MD5は暗号学的に安全ではないため、強度の高いハッシュアルゴリズム(SHA-256など)への移行が望ましい。 - パスワード漏洩リスク:
認証情報が漏れた場合、パスワードも推測される可能性があるため、十分な長さと複雑さを持つパスワードが必要。 - 処理負荷:
ダイジェスト認証はハッシュ計算を複数回行うため、端末やサーバーに負荷がかかる。
まとめ
- 認証の仕組み:
- 発信側がパスワードとチャレンジ値(ランダムな値)を使ってレスポンス値(ハッシュ値)を生成し、着信側に送信します。
- 着信側も同じ方法でレスポンス値を計算し、一致すれば認証成功。
- 着信側の前提:
- 着信側は発信側のパスワード(またはそのハッシュ値)を知っている必要があります。
- 特徴:
- パスワードそのものを送信しないため安全性が高い。
- リプレイ攻撃を防ぐためにチャレンジ値(nonce)を使用。
- パスワード漏洩リスク:
- 着信側のパスワードデータベースが攻撃されると、情報漏洩の可能性がある。
- 進化した方式:
- 公開鍵暗号方式では、着信側がパスワードを知らなくても認証が可能で、より安全性が高い。
このように、チャレンジレスポンス方式はセキュリティ上の利点がある一方で、パスワード管理の適切な対策が必要です。