AS3中的Md5密码

时间:2012-05-07 09:06:02

标签: c# actionscript-3 passwords md5

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

2 个答案:

答案 0 :(得分:1)

因此看起来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==
    }

答案 1 :(得分:0)

Look at this

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

如果你正在使用AS3CoreLib,那就这样做:

Different MD5 with as3corelib