パスワード管理に MD5 を使う (unibon)

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

ASP でユーザを認証する処理を実装する場合、パスワードの保管をどのようにおこなうかが問題となります。
パスワードの文字列をプレーンテキストとして保管している場合も多いと思われますが、パスワード文字列を保管しているファイルやデータベースが漏洩した場合、それを取得した者がログオンできてしまいます。
プレーンな文字列を格納せずに、MD5 などの一方向ハッシュ関数をかけた文字列だけを格納しておけば、このような漏洩に対抗できます。

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

実際にこのサンプルが動いている例は こちら です(新しいウィンドウが開きます。なお都合によりサーバが動いていない時もあります)。
ログオン画面用(md5dbclient.html)
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<TITLE>パスワード管理に MD5 を使うサンプル (unibon)</TITLE>
</HEAD>
<BODY>
<H2>パスワード管理に MD5 を使うサンプル</H2>
ユーザ名とパスワードを入力してボタンを押してください。
<BR>未知のユーザ名の場合は、ユーザ登録処理になり、既知のユーザ名の場合は認証処理になります。
<BR>(ユーザ名およびパスワードの管理にはアプリケーション変数を使っていますので、不定期にクリアされます。)
<FORM METHOD=post ACTION="md5dbserver.asp">
ユーザ名: <INPUT TYPE=text NAME=username>
<BR>パスワード: <INPUT TYPE=password NAME=plainpassword>
<BR><INPUT TYPE=submit VALUE="ログオンまたはユーザ登録">
</FORM>
</BODY>
</HTML>

認証処理用(md5dbserver.asp)
<%@Language=VBScript EnableSessionState=False%><%
Option Explicit

' ここに MD5 のサブルーチンを挿入してください。
' なおビットシフト用のサブルーチンも必要です。
' Option Explicit が重複しないように注意してください。
' main 関数やその呼び出しは取り除いてください。

Const prefixPassword = "md5db_"

Dim status

Dim username
username = Request.Form("username")
Dim plainpassword
plainpassword = Request.Form("plainpassword")
Dim md5password
md5password = MDString(plainpassword)
If IsEmpty(Application(prefixPassword & username)) Then ' ユーザの新規登録
    status = 0
    ' Application 変数を簡易データベースとして使用する。
    ' MD5 化したパスワードのみ格納し、プレーンなパスワードは格納していない。
    Application(prefixPassword & username) = md5password
Else ' 既存ユーザの認証
    If (Application(prefixPassword & username) = 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 を使うサンプル</H2>
<%If status = 0 Then%>
<%=username%> さん、ようこそ。
<BR>あなたは、新規ユーザとして登録されました。
<BR>ちなみに、MD5 化されたあなたのパスワードは <%=md5password%> です。
<%ElseIf status = 1 Then%>
<%=username%> さん、ようこそ。
<BR>あなたは、既存のユーザです。認証に成功しました。
<BR>ちなみに、MD5 化されたあなたのパスワードは <%=md5password%> です。
<%ElseIf status = 2 Then%>
<%=username%> さんは、既存のユーザですが、認証に失敗しました。
<BR>すなわち、あなたが <%=username%> さんとは認められません。
<BR>あなたが今入力したパスワードを MD5 化した結果は <%=md5password%> です。
<BR>ちなみに、MD5 化されてデータベースに格納されている <%=username%> さんのパスワードは <%=Application(prefixPassword & username)%> です。
<BR>(しかし、ログオン画面でこの文字列を使ってもログオンすることはできません。)
<%Else%>
内部エラー
<%End If%>
<P><A HREF=md5dbclient.html>ログオン画面へ戻る</A>
</BODY>
</HTML>

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