C# 中的 MD5 哈希与动作脚本中的 MD5 哈希不匹配
Posted
技术标签:
【中文标题】C# 中的 MD5 哈希与动作脚本中的 MD5 哈希不匹配【英文标题】:MD5 Hash in C# doesn't match MD5 Hash in Action Script 【发布时间】:2010-08-27 04:04:00 【问题描述】:我在 Action Script 中对一些数据进行哈希处理,然后将哈希值与在 C# 中计算的哈希值进行比较,但它们不匹配。
有人知道为什么吗?
这是我在动作脚本中所做的:
var hash : String = MD5.hash(theString);
这就是我在 C# 中所做的:
var md5Hasher = MD5.Create();
byte[] data = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(theSameString));
var sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
sBuilder.Append(data[i].ToString("x2"));
var hash = sBuidler.ToString();
我认为这是一个编码的东西,但我不能指望它......让我知道!
-EV
【问题讨论】:
【参考方案1】:ActionScript 必须使用不同的字符串编码,但我不清楚是哪一种(我尝试 google,但很难找到)。
因此,我建议您尝试以下方法:
Console.WriteLine(ToHex(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes("ä"))));
Console.WriteLine(ToHex(MD5.Create().ComputeHash(Encoding.Unicode.GetBytes("ä"))));
Console.WriteLine(ToHex(MD5.Create().ComputeHash(Encoding.GetEncoding("ISO-8859-1").GetBytes("ä"))));
(当然,ToHex
是您已经编写的将事物转换为十六进制的函数:)
static string ToHex(byte[] data)
var sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
sBuilder.Append(data[i].ToString("x2"));
return sBuilder.ToString();
然后检查您获得的三个哈希值中的哪一个与 ActionScript 中的哈希值相同。然后您就会知道 ActionScript 使用哪种编码。
【讨论】:
感谢您的建议,我找到了正确的编码。事实证明: byte[] data = md5Hasher.ComputeHash(Encoding.GetEncoding("ISO-8859-1").GetBytes(input));是正确的。谢谢! -EV【参考方案2】:ActionScript 中的字符串采用 UTF-16 编码。
【讨论】:
这与this earlier question about MD5 in ActionScript and php 上接受的答案相矛盾,后者声称 ActionScript 使用 UTF-8。那么谁是对的呢? 见this。 在这种情况下,原来是被编码为ISO-8859-1 谢谢帮助! @Jeff Mattfield。这与问题无关。这就是flash 在内部 存储字符串的方式。如果您有一个字符串并且想要获取字节,您可以调用 ByteArray::writeUFT 或 ByteArray::writeUTFBytes,它们使用 UTF-8 对字符串进行编码。 @Ev.我会说你的字符串是在 C# 端编码的 iso-8859-1。以上是关于C# 中的 MD5 哈希与动作脚本中的 MD5 哈希不匹配的主要内容,如果未能解决你的问题,请参考以下文章
可以安全地重用 MD5CryptoServiceProvider 来计算多线程代码中的 md5 哈希吗?