1

我在重新创建在 C# 中散列的密码时遇到问题。在一个在线项目中,当用户进行注册过程时,他的密码在通过此功能后被保存:

private static string ToMD5Hash(string inputString)
{
   using (MD5 md5 = MD5.Create())
   {
      byte[] data = Encoding.Unicode.GetBytes(inputString);
      byte[] hash = md5.ComputeHash(data);

      return Convert.ToBase64String(hash);
   }
}

我正在开发一个离线版本,该版本有时会与在线版本同步,但我无法在 AS3 (Adobe Air) 上重现相同的结果。例如,传递给 C# 代码后的密码“1234”将是“DwN1hMmef9T0+MWVUPj1Bw==”。

有人可以帮我吗?

我的 AS3 代码是这样的:

private function encode():void
{
var ba:ByteArray = new ByteArray();
ba.writeMultiByte("1234","unicode");
var str:String = MD5.hash(ba.toString());

var ba2:ByteArray = new ByteArray();
ba2.writeMultiByte(str.toString(),"unicode");

var encoder:Base64Encoder = new Base64Encoder();
encoder.encodeUTFBytes(ba2.toString());
    trace(encoder.toString());
}

当我这样做时,ba.writeMultiByte("1234","unicode");我得到的结果与ByteArrayC# 中的完全一样,但是当我这样做时MD5.hash(ba.toString());,新ByteArray的就不同了。

4

2 回答 2

1

所以看起来这可能是 as3corelib 将位写入digest ByteArray.

它似乎以大端格式而不是小端格式编写它们。或者更具体地说,它将位写入 4 个整数的集合而不是字节的集合,并且在此过程中它会破坏位的字节顺序(这就是您看到不同 Base64 结果的原因——字节位于不同的顺序)。

您可以通过在 MD5.as的第 184 行添加解决此错误,在 as3corelib 中,插入以下一行代码:

digest.endian = Endian.LITTLE_ENDIAN;

还要确保在文件顶部为import flash.utils.Endian. 我在此处创建了可用更改的公共要点

然后它应该生成与 c# 相同的字节顺序,然后它应该以相同的方式进行 Base64 编码。我使用以下 as3 函数对其进行了验证:

    private function encode():void 
    { 
        var ba:ByteArray = new ByteArray();
        ba.endian = Endian.BIG_ENDIAN
        ba.writeMultiByte("1234","unicode");
        var str:String = MD5.hashBytes(ba);

        var encoder:Base64Encoder = new Base64Encoder();
        encoder.encodeBytes(MD5.digest);
        trace(encoder.toString()); // DwN1hMmef9T0+MWVUPj1Bw==
    }
于 2012-05-08T17:45:28.923 回答
0

看看这个

请注意,该站点中提到的原始下载有一些错误,因此您必须使用可以在同一篇文章中找到的更正版本。

如果您使用的是 AS3CoreLib,请这样做:

与 as3corelib 不同的 MD5

于 2012-05-07T09:14:40.590 回答