CRAM-MD5はPOP, IMAPで使用されるチャレンジ・レスポンス方式の認証方法で、HMAC-MD5ハッシュアルゴリズムを用いてパスワードを暗号化する。 IMAPのAUTHENTICATEコマンドおよびPOPのAUTHコマンドにてCRAM-MD5による認証を行う場合のシーケンスは次のようになる。
AUTHENTICATEコマンド/AUTHコマンドで送受信される内容はBase64エンコードされるため、上記の送受信内容をデコードすると次のようになっている。 ここではユーザー名にuser
、パスワードにpass
を使用している。
AUTHENTICATEコマンド/AUTHコマンドを送信すると、サーバーからはまずタイムスタンプとホスト名を含むチャレンジコードがBase64エンコードされた上で返される。 上記の例では<4001344112143594.1272499550@mail.example.net>
がチャレンジコードである。
クライアントは、サーバーから受信したチャレンジコードに対してパスワードをキーにしたHMAC-MD5ハッシュアルゴリズムを適用し、さらに認証を行うユーザ名とHMAC-MD5を適用したチャレンジコードを連結し、それをBase64エンコードしてレスポンスとして返す。 上記の例では1d1b91b7ad3fc261f9cd829531f235ec
がHMAC-MD5ハッシュ化したチャレンジコードである。
この処理を図式化して表記すると以下のようになる。
C#でのCRAM-MD5認証の実装
Mono/.NET FrameworkではHMAC-MD5ハッシュ値の計算にSystem.Security.Cryptography.HMACMD5クラスのComputeHashメソッドを用いることが出来る。 次の例は受信したチャレンジコードと、ユーザ名、パスワードを引数としてCRAM-MD5認証のレスポンスを返すメソッド。
C#でのHMAC-MD5の実装
次の例はRFC 2104で記述されている内容に基づいて作成したHMAC-MD5ハッシュ値の計算を行うメソッド。 HMACMD5.ComputeHashメソッドに相当するものを実装したもの。 (コメントはRFCより抜粋)