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

时间:2011-10-24 13:08:30

标签: c# hash asp-classic md5

在Classic 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();

1 个答案:

答案 0 :(得分:5)

问题是您正在使用Encoding.Default编码represents 7 bit ASCII characters。与此同时,“CAPICOM manipulates only Unicode strings while validating and generating digital signatures”。

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

Encoding.Default替换为Encoding.Unicode,以使您的.NET实现与CAPICOM兼容。

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