パスワード伝送に MD5 を使う (unibon)

2002年03月10日: 新規作成
認証用のパスワードの伝送に MD5 を使います。VBScript および JavaScript で MD5 のモジュールを使用しています。

ASP でユーザを認証する処理を実装する場合、パスワードをネットワーク経由で伝送する必要がありますが、パスワードがネットワークにさらされることが問題となります。
パスワードの文字列をプレーンテキストとして伝送したりすることもありますが、重要な情報をやりとりするサービスには使えないです。基本認証も BASE64 は使っていますが、実質的にはプレーンテキストと同等です。
今回は、チャレンジ・アンド・レスポンスのやりかたで、パスワードを伝送します。

つぎに、この対処によってできることと、できないこと(あるいは、やっていないこと)をまとめてみます。

実際にこのサンプルが動いている例は こちら です(新しいウィンドウが開きます。なお都合によりサーバが動いていない時もあります)。
ログオン画面用(md5netclient.asp)
<%@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>

ユーザ登録用(md5netregister.asp)
<%@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>

認証処理用(md5netserver.asp)
<%@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>

ASP の目次
ホーム
(このページ自身の絶対的な URL)