经典的asp使用capicom进行md5散列 - 结果与.net System.Security.Cryptography不同

ull*_*ink 4 c# hash md5 asp-classic

在Classic ASP(VBScript)中使用CAPICOM执行MD5哈希时,如下所示:

With server.CreateObject("CAPICOM.HashedData")
    .Algorithm = 3                  ' CAPICOM_HASH_ALGORITHM_MD5
    .Hash "password"

    md5Pwd = .Value
End With
Run Code Online (Sandbox Code Playgroud)

我得到这个结果: B081DBE85E1EC3FFC3D4E7D0227400CD

当我使用.NET时,我得到了这个结果: 5f4dcc3b5aa765d61d8327deb882cf99

为什么MD5字符串不同?我究竟做错了什么?

这是我的C#函数:

MD5 md5Hasher = MD5.Create();
byte[] data = md5Hasher.ComputeHash( Encoding.Default.GetBytes( val ) );

StringBuilder sBuilder = new StringBuilder();

// Loop through each byte of the hashed data 
// and format each one as a hexadecimal string.
for( int i = 0; i < data.Length; i++ ) {
    sBuilder.Append( data[i].ToString( "x2" ) );
}

// Return the hexadecimal string.
return sBuilder.ToString();
Run Code Online (Sandbox Code Playgroud)

Art*_*lev 5

问题是您使用的Encoding.Default代表7位ASCII字符的编码.同时," CAPICOM在验证和生成数字签名时仅操作Unicode字符串 ".

因此,Encoding.Default.GetBytes处理单字节字符(顺便丢失任何非ASCII数据),而CAPICOM.HashedData将它们视为2字节Unicode字符.

替换Encoding.DefaultEncoding.Unicode,使您的.NET实现能与CAPICOM兼容.

还有一点需要注意,用于data[i].ToString("X2")生成大写结果,就像在CAPICOM实现中一样.