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
我得到这个结果: 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();
问题是您使用的Encoding.Default是代表7位ASCII字符的编码.同时," CAPICOM在验证和生成数字签名时仅操作Unicode字符串 ".
因此,Encoding.Default.GetBytes处理单字节字符(顺便丢失任何非ASCII数据),而CAPICOM.HashedData将它们视为2字节Unicode字符.
替换Encoding.Default用Encoding.Unicode,使您的.NET实现能与CAPICOM兼容.
还有一点需要注意,用于data[i].ToString("X2")生成大写结果,就像在CAPICOM实现中一样.
| 归档时间: | 
 | 
| 查看次数: | 1337 次 | 
| 最近记录: |