我在重新创建在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
会有所不同。
答案 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)
请注意,该网站中提到的原始下载有一些错误,因此您必须使用可在同一帖子中找到的更正版本。
如果你正在使用AS3CoreLib,那就这样做: