如何在Classic ASP中散列UTF-8字符串

时间:2012-01-27 14:09:51

标签: .net asp-classic utf-8 character-encoding md5

我一直在寻找一个经典的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

5 个答案:

答案 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。 一些好的(免费)反编译器是:

1- http://www.reflector.net/

2- http://www.telerik.com/products/decompiler.aspx