ASP でユーザを認証する処理を実装する場合、パスワードをネットワーク経由で伝送する必要がありますが、パスワードがネットワークにさらされることが問題となります。
パスワードの文字列をプレーンテキストとして伝送したりすることもありますが、重要な情報をやりとりするサービスには使えないです。基本認証も BASE64 は使っていますが、実質的にはプレーンテキストと同等です。
今回は、チャレンジ・アンド・レスポンスのやりかたで、パスワードを伝送します。
つぎに、この対処によってできることと、できないこと(あるいは、やっていないこと)をまとめてみます。
<%@Language=VBScript EnableSessionState=True%><%
Option Explicit
Randomize
Dim r
r = CLng(CDbl(Rnd(1)) * (2 ^ 24))
Dim challenge
challenge = Right("000000" & LCase(Hex(r)), 6)
Session("challenge") = challenge
%><HTML>
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<TITLE>パスワード伝送に MD5 を使うサンプル (unibon)</TITLE>
<SCRIPT LANGUAGE=JavaScript>
<!--
// ここに MD5 のモジュールを挿入してください。
// main 関数やその呼び出しは取り除いてください。
var challenge = "<%=challenge%>";
function submitForm() {
var username = document.plainform.username.value;
var plainpassword = document.plainform.plainpassword.value;
var md5password = MDString(challenge + plainpassword);
document.md5form.username.value = username;
document.md5form.md5password.value = md5password;
document.md5form.submit();
}
// -->
</SCRIPT>
</HEAD>
<BODY>
<H2>パスワード伝送に MD5 を使うサンプル (unibon)</H2>
<FORM NAME=plainform METHOD=post ACTION="md5netregister.asp">
ユーザ名: <INPUT TYPE=text NAME=username>
<BR>パスワード: <INPUT TYPE=password NAME=plainpassword>
<BR><INPUT TYPE=button VALUE="ログオン" onClick="submitForm()">
<BR><INPUT TYPE=submit VALUE="ユーザ登録"> (プレーンテキストでパスワード文字列が送信されます)
</FORM>
(ちなみに、チャレンジコードは <%=challenge%> です。)
<FORM NAME=md5form METHOD=post ACTION="md5netserver.asp">
<INPUT TYPE=hidden NAME=username>
<INPUT TYPE=hidden NAME=md5password>
</FORM>
</BODY>
</HTML>
<%@Language=VBScript EnableSessionState=True%><%
Option Explicit
Const prefixPassword = "md5net_"
Dim status
Dim username
username = Request.Form("username")
Dim plainpassword
plainpassword = Request.Form("plainpassword")
If IsEmpty(Application(prefixPassword & username)) Then ' ユーザが未登録
status = 0
Application(prefixPassword & username) = plainpassword
Else ' すでに登録済みのユーザ
status = 1
End IF
%><HTML>
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<TITLE>パスワード伝送に MD5 を使うサンプル (unibon)</TITLE>
</HEAD>
<BODY>
<H2>パスワード伝送に MD5 を使うサンプル (unibon)</H2>
<%If status = 0 Then%>
<%=username%> さん、ようこそ。
<BR>あなたは、未登録ユーザです。
<BR>あなたのパスワードを登録しました。
<%ElseIf status = 1 Then%>
<%=username%> さん、ようこそ。
<BR>あなたは、すでに登録済みのユーザです。
<BR>パスワードを登録する必要はありません。
<%Else%>
内部エラー
<%End If%>
<P><A HREF=md5netclient.asp>ログオン画面へ戻る</A>
</BODY>
</HTML>
<%@Language=VBScript EnableSessionState=True%><%
Option Explicit
' ここに MD5 のサブルーチンを挿入してください。
' なおビットシフト用のサブルーチンも必要です。
' Option Explicit が重複しないように注意してください。
' main 関数やその呼び出しは取り除いてください。
Const prefixPassword = "md5net_"
Dim status
Dim username
username = Request.Form("username")
Dim md5password
md5password = Request.Form("md5password")
Dim challenge
challenge = Session("challenge")
If IsEmpty(Application(prefixPassword & username)) Then ' ユーザが未登録
status = 0
Else ' 既存ユーザの認証
Dim serverPassword
serverPassword = MDString(Session("challenge") & Application(prefixPassword & username))
If (serverPassword = md5password) Then ' 認証成功
status = 1
Else ' 認証失敗
status = 2
End If
End IF
%><HTML>
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<TITLE>パスワード伝送に MD5 を使うサンプル (unibon)</TITLE>
</HEAD>
<BODY>
<H2>パスワード伝送に MD5 を使うサンプル (unibon)</H2>
<%If status = 0 Then%>
<%=username%> さん、ようこそ。
<BR>あなたは、未登録ユーザです。
<BR>まずログオン画面のユーザ登録ボタンで登録してください。
<%ElseIf status = 1 Then%>
<%=username%> さん、ようこそ。
<BR>あなたは、既存のユーザです。認証に成功しました。
<BR>ちなみに、チャレンジコードは <%=challenge%> であり、これとあなたのパスワードを連結したものを MD5 化した文字列は <%=md5password%> です。
<%ElseIf status = 2 Then%>
<%=username%> さんは、既存のユーザですが、認証に失敗しました。
<BR>すなわち、あなたが <%=username%> さんとは認められません。
<BR>ちなみに、チャレンジコードは <%=challenge%> です。
<BR>これと、あなたが今入力したパスワードを MD5 化した結果は <%=md5password%> です。
<BR>ちなみに、<%=username%> さんのパスワードを使って MD5 化した結果は <%=serverPassword%> です。
<BR>(しかし、ログオン画面でこの文字列を使ってもログオンすることはできません。)
<%Else%>
内部エラー
<%End If%>
<P><A HREF=md5netclient.asp>ログオン画面へ戻る</A>
</BODY>
</HTML>