我一直在寻找一个经典的ASP脚本,它允许我使用MD5算法来散列字符串。我需要将此散列字符串与ASP.NET页面中的相同字符串进行匹配,使用.NET的MD5散列算法进行散列。
即使我找到了几个生成哈希的经典ASP脚本,但我没有找到使用非英文字符生成正确哈希的脚本(例如ñ
)。
你知道一些适用于这种特殊情况的经典ASP脚本吗?
注意:
我试过这些脚本:
http://userpages.umbc.edu/~mabzug1/cs/md5/md5.asp
http://forums.aspfree.com/code-bank-54/asp-classic-md5-hash-82164.html
示例:
字符串:
muñeca
纠正MD5哈希:
ea07bec1f37f4b56ebe368355d1c058f
Generated Hash:
298e60cb1179df15d5772726a3975132
答案 0 :(得分:2)
哈希计算本身不是你的问题。你在.net中使用UTF-8,在asp classic中使用ANSI / Latin1。
哈希算法对字节序列进行操作,而不是对字符串进行操作。因此,您首先需要首先将字符串转换为字节序列,这个过程称为编码。常见的选择是ANSI(Windows上与语言环境相关的遗留编码),UTF-8和UTF-16 LE。
首先选择一种编码,并在两个平台上一致地使用它。我推荐使用UTF-8,通过Encoding.UTF.GetBytes()
访问.net。你需要搜索UTF-8 + asp classic来弄清楚如何使用它。由于UTF-8编码是一个常见问题,我相信你会找到一些东西。
我怀疑你的asp经典代码使用ANSI,但我强烈建议不使用它,因为它只支持一小部分可能的字符,并且依赖于语言环境。
答案 1 :(得分:2)
散列任何字符串的第一部分是获取字符串字符的字节数组。创建的字节数组取决于用于字符串的编码类型。 .Net字符串以UTF-16编码。我不记得vbscript的编码类型与我的头类型有关,但它可能只是ascii或最好是UTF-8。
因此,为了解决您的问题,您需要做的第一件事就是让vbscript为您提供一个字节数组,表示字符串中的UTF-16字符。然后去寻找一个直接需要字节数组的md5哈希函数,而不是字符串类型。
不幸的是,即使这可能还不够。这有可能是VBScript的缺乏本地UTF-16可能会导致什么通常是的轻微的从用户的字符串输入,高保真的损失,使得您的经典ASP代码串的没有与ASP.Net代码中的字符串完全相同的字符。如果是这种情况,唯一的解决方案是更改ASP.Net代码以匹配经典ASP编码,而不是相反。无论如何,这可能是更容易的解决方案。为此,您需要知道完全您的vbscript代码使用的字符编码。再说一遍,我的脑子里再也没有那些信息,所以你可以像我一样谷歌。
答案 2 :(得分:1)
使用此功能,您可以将纯文本哈希到:
SHA1,SHA256,SHA384,SHA512,MD5,RIPEMD160
如果您需要更多信息,可以在http://www.novacontract.al/en
Function Hash(HashType, PlainText)
On Error Resume Next
With CreateObject("ADODB.Stream")
.Open
.CharSet = "Windows-1252"
.WriteText PlainText
.Position = 0
.CharSet = "UTF-8"
PlainText = .ReadText
.Close
End With
Set UTF8Encoding = CreateObject("System.Text.UTF8Encoding")
Dim PlainTextToBytes, BytesToHashedBytes, HashedBytesToHex
PlainTextToBytes = UTF8Encoding.GetBytes_4(PlainText)
Select Case HashType
Case "sha1": Set Cryptography = CreateObject("System.Security.Cryptography.SHA1Managed")
Case "sha256": Set Cryptography = CreateObject("System.Security.Cryptography.SHA256Managed")
Case "sha384": Set Cryptography = CreateObject("System.Security.Cryptography.SHA384Managed")
Case "sha512": Set Cryptography = CreateObject("System.Security.Cryptography.SHA512Managed")
Case "md5": Set Cryptography = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")
Case "ripemd160": Set Cryptography = CreateObject("System.Security.Cryptography.RIPEMD160Managed")
End Select
Cryptography.Initialize()
BytesToHashedBytes = Cryptography.ComputeHash_2((PlainTextToBytes))
For x = 1 To LenB(BytesToHashedBytes)
HashedBytesToHex = HashedBytesToHex & Right("0" & Hex(AscB(MidB(BytesToHashedBytes, x, 1))), 2)
Next
Hash = LCase(HashedBytesToHex)
If Err.Number <> 0 Then Response.Write(Err.Description)
On Error GoTo 0
End Function
这些可以使用如下:
Hash("sha512", "Hello World")
产地:
2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b
Hash("sha256", "Hello World")
产地:
a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
Hash("md5", "muñeca")
产地:
ea07bec1f37f4b56ebe368355d1c058f
答案 3 :(得分:0)
您可以将.NET MD5哈希代码包装在COM-visible assembly中。然后,您可以在ASP.NET和传统ASP站点上部署和使用相同的MD5散列代码。
答案 4 :(得分:-3)
如果你想要.Net做什么,你可以从 HashAlgorithm 类(也考虑 MD5CryptoServiceProvider 类)反编译 ComputeHash 方法.Net程序集 mscorlib.dll (来自计算机中的路径:C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ mscorlib.dll) 然后将代码转换为ASP-Classic。 一些好的(免费)反编译器是: