在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();
答案 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实现中一样。