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 哈希吗?

如何在 PostMan 的预请求脚本中计算 md5 哈希?

获取python中带有子目录的目录中的所有文件md5哈希

删除基于MD5哈希的文件

Azure 存储 Node.js SDK - MD5 哈希与本地不同

c#中的哈希字符串