【问题标题】:Md5 Password in AS3AS3 中的 Md5 密码
【发布时间】:2012-05-15 19:14:31
【问题描述】:

我在重新创建在 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"); 时,我得到的 ByteArray 与 C# 中的完全相同,但是当我执行 MD5.hash(ba.toString()); 时,新的 ByteArray 不同。

【问题讨论】:

  • 你的 as3 函数是什么样的?你从中得到什么价值?可能是字符编码问题,您使用的是Encoding.Unicode,我相信它是UTF16,我会假设您的as3 编码是UTF8,但是如果不看到您在做什么就很难说。
  • 嗨 32bitkid,我已经添加了我的 as3 代码,在此先感谢 Alex
  • 我认为您的 actionscript 版本中有太多 toString() 调用。我不认为它会做你认为它会做的事情。特别是当您将 ByteArray 传递给 md5 哈希器时

标签: c# actionscript-3 passwords md5


【解决方案1】:

Look at this.

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

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

Different MD5 with as3corelib.

【讨论】:

  • 嗨 JotaBe,我已经看过那篇文章,但没有成功,我忘了提到我正在尝试使用 as3corelib,但没有任何方法可以重现相同的结果。感谢您的帮助。
  • 嗨,我再次检查了所有内容,我的问题是当我在 AS3 中执行 MD5.hash() 时,我只是执行 myBytearray.toString(),结果与我在 c# 上得到的结果不同,一切都是一样的结果。提前致谢
【解决方案2】:

所以看起来这可能是 as3corelib 将位写入digest ByteArray 的实现中的一个错误。

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

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

digest.endian = Endian.LITTLE_ENDIAN;

还要确保在文件顶部为import flash.utils.Endian 添加导入。我已经创建了可用更改的公共要点here

然后它应该生成与 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==
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 2015-01-13
    • 2011-04-30
    • 2021-07-03
    相关资源
    最近更新 更多