C/C++ を使った SMTP ユーザー認証テクニック
中井技術工房 CRAM-MD5なんて怖くない! March.15,2009 改正

システム一覧表 | くたばれジャンクメール | メール受信ソフトテク   トップ > ここ

CRAM MD5認証テクニックはなぜ必要か?

最近、迷惑メール対策で、メールサーバーの送信ポートを垂れ流し型の25番からユーザー認証付きの587番に変更する流れになっています。
このユーザー認証に使われているもっとも一般的なテクが
CRAM MD5 です。

送信プログラム開発にはこのテクが必要で、当方でも悪戦苦闘してクリアしました。
まあ1ケ月かかるかも、と思っていたのに3日でクリアでき、まさにネットのありがたみを痛感しました。
このテクは人が作ったものにほとんどタダ乗りしましたので、公開しておきます。

なお、RFC公開ソースを利用している旨をソースに記述せよ、とRFCの公開資料に書かれていることをお忘れなく!


MD5の原理は知る必要がない

MD5 の計算原理はまったく知る必要がありません。こんなのは数学者にまかせましょう。
MD5 と認証に必要な CRAM MD5 のソースが RFC から公開されていますので、これをちゃっかり利用すればOKです。
当方ではこうしてプログラムを作って通しました。
RFC公開ソースは、古い形式の C で書かれていますが、致命的なバグはないので、ちょっといじってやれば今風になります。

[ MD5/CRAM-MD5 の原理やプログラムを垣間見たければ ]

いろいろありましたが、結局、○をつけた2つの C ソースを C++ 用にいじって使いました。
大きなバグはなく、; が1つ抜けていただけで、そこを修正すれば一発で通りました。


MD5 と CRAM MD5 はちょっと違う

CRAM MD5 は MD5 の変形版みたいなもので、キー付き認証になっています。
内部テクニックから見ると MD5 の2重計算みたいになっています。
そのため、公開されている MD5 の計算プログラムを追いかけるのはヤメましょう。MD5 計算を知っても、キー付きMD5計算も知る必要があり、時間のムダです。

実際にはサーバーからBASE64変換されて送られてくる「チャレンジ文字列」にパスワードをキーにして HMAC-MD5(これがキー付きMD5) の計算をして、文字列を求めます。

こうして得られた文字列の頭にアカウントをくっつけて, BASE64変換した文字列をサーバーに送ってやれば認証は完了します。


認証例

当方がSMTP サーバーと実際に通信した結果をお見せします。その方が早いでしょう。
なお、
となっています。

[ 認証例 ]

[R]:220 smtp-c.stnet.ne.jp ESMTP
[S]:EHLO smtp.netwave.or.jp
[R]:250-smtp-c.stnet.ne.jp
250-PIPELINING
250-SIZE 10485760
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN CRAM-MD5
250-AUTH=LOGIN PLAIN CRAM-MD5
250 8BITMIME
[S]:AUTH CRAM-MD5
[R]:334 PDE4MTE0MDQ3MjcuMTE1OTgzOTdAc210cC1jLnN0bmV0Lm5lLmpwPg==
[M]:チャレンジ文字列 <1811404727.11598397@smtp-c.stnet.ne.jp>
[M]: ANS 合成文字列 = XXXXXXXX f25846dc7d5fc3a65775eff5809d16cd (アカウント+ Keyed MD5 Digest)
[M]: ANS BASE64変換後 = bmFrYWk5OUBtYWlsLm5ldHdhdmUub3IuanAgZjI1ODQ2ZGM3ZDVmYzNhNjU3NzVlZmY1ODA5ZDE2Y2Q=
[S]:bmFrYWk5OUBtYWlsLm5ldHdhdmUub3IuanAgZjI1ODQ2ZGM3ZDVmYzNhNjU3NzVlZmY1ODA5ZDE2Y2Q=
[R]:235 Authentication successful
[S]:MAIL FROM: "nakai99@mail.netwave.or.jp"
[R]:250 Ok
[S]:RCPT TO: "nakai99@mail.netwave.or.jp"
[R]:250 Ok
[S]:DATA
[R]:354 End data with .
[S]:Subject: =?iso-2022-jp?B?VGVzdBskQkF3Py4kRyQ5ISMbKEI=?=
[S]:From: =?iso-2022-jp?B?GyRCQ2YwZiRoJGobKEI=?=
以下略

[ 解説 ]


必要なのは BASE64 変換とキー付きMD5 計算

上記のサンプルでおわかりでしょう。
BASE64 変換/逆変換とキー付きMD5 計算ができれば認証ソフトは作れます。


サンプルソース

MD5 ソフトサンプル(MD5Smpl.lzh) Ver1.00 Feb.13,2008 のダウンロード

[ 内容 ]

[ 注意 ]

最低限ネットアクセスのソフトが書けないとここで紹介するサンプルは使えないと思います。
次の本でも読んで CSocket が使えるようになってからもう一度おいでください。
"WinSock2 プログラミング ルイス・ナッパー著 江村豊監訳 ソフトバンククリエイティブ"
この本は私が「メール送受信ソフト、FTP ソフト」を作るのに参考にしている本です。
CSocket の使い方がこれでわかります。
送受信のプロトコルは RFC の原文を読んだ方が早いと思います。


トップ > 頁トップ