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

本文关键字:net System Security 不同 Cryptography 结果 使用 asp capicom 进行 哈希 | 更新日期: 2023-09-27 18:12:18

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

With server.CreateObject("CAPICOM.HashedData")
    .Algorithm = 3                  ' CAPICOM_HASH_ALGORITHM_MD5
    .Hash "password"
    md5Pwd = .Value
End With
我得到这个结果: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();

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

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

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

Encoding.Default替换为Encoding.Unicode,使你的。net实现与CAPICOM兼容。

还有一个注意事项,使用data[i].ToString("X2")来生成大写的结果,就像在CAPICOM实现中一样。