ASPではRudong.com Forumなどで利用されているASPでMD5関数を利用しています。MD5関数で暗号化された文字列は以下のとおりです。
1165d25d8cd021d5
また、Asp.Net では次のメソッドがあります。
System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password.Text,"MD5")
MD5 暗号化の結果は次のようになります。
12C403B91165D25D8CD021D5F9B5BB7F
その理由は、ASP の MD5 関数が 32 ビット MD5 ハッシュ値の 9 番目から 25 番目のビットを使用し、それを暗号文として小文字に変更するためです。これを知っていると、ASP.NET の結果を使用して、少しの処理で古いデータベースのパスワード文字列を比較できます。
ASP の MD5 関数の 353 行目と 354 行目:
'MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))
MD5=LCase(WordToHex(b) & WordToHex(c)) 'これを 16 バイトのデータベース パスワードに合わせて切り取ります :D
最初の文はすべての 32 ビット暗号文を取得し、2 番目の文は中間の 9 ビット目から 25 ビット目までを 16 ビット暗号文として取得します。
vb.net に関しては、問題が再び発生します。vb.net では、System.Web.Security 名前空間は使用できず、上記の単純な方法は MD5 暗号化に使用できません。そこで、これを処理するために次の関数を作成しました:
VB.NET:
「MD5暗号化機能」
パブリック共有関数 MD5(ByVal strSource As String、ByVal Code As Int16) As String
ここでは、ASCII エンコードされたパスワードの元のテキストが使用されます。パスワードとして漢字を使用する場合は、UnicodeEncoding を使用できますが、ASP の MD5 関数と互換性がありません。
Dim dataToHash As Byte() = (New System.Text.ASCIIEncoding).GetBytes(strSource)
Dim ハッシュ値 As Byte() = CType(System.Security.Cryptography.CryptoConfig.CreateFromName("MD5"), System.Security.Cryptography.HashAlgorithm).ComputeHash(dataToHash)
Dim i を整数として
ケースコードの選択
Case 16 '16ビット文字の暗号化結果を選択する
i = 4 ~ 11 の場合
MD5 += Hex(ハッシュ値(i)).ToLower
次
Case 32 '32ビット文字の暗号化結果を選択する
i = 0 ~ 15 の場合
MD5 += Hex(ハッシュ値(i)).ToLower
次
Case Else 'コードが間違っている場合、文字列全体、つまり 32 ビット文字を返します
For i = 0 to hashvalue.Length - 1
MD5 += Hex(ハッシュ値(i)).ToLower
次
エンドセレクト
終了関数
出典: AndyDavis BLOG