2012-05-07 4 views
1

У меня проблема с воссозданием пароля, который хэшируется на C#. В онлайн-проекте, когда пользователь сделать процесс регистрации его пароль сохранения после прохождения этой функции:Пароль Md5 в AS3

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); 
    } 
} 

Я работаю на автономную версию, что в какой-то момент будет делать синхронизацию с онлайн-версией и I не может воспроизвести те же результаты на AS3 (Adobe Air). Например, пароль «1234» после перехода к C# -коду будет «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 отличается.

+0

Как выглядит ваша функция as3? Какая ценность у вас получается? Это может быть проблема кодирования символов, вы используете 'Encoding.Unicode', который, я считаю, UTF16, и я бы предположил, что ваша кодировка as3 - UTF8, но трудно сказать, не видя, что вы делаете. –

+0

Привет, 32bitkid, я добавил свой код as3, заранее спасибо Alex – Alex

+0

Я думаю, что у вас слишком много вызовов 'toString()' в вашей версии ActionScript. Я не думаю, что это делает то, что вы думаете, что это будет делать. Особенно, когда вы переходите к 'ByteArray' к хешеру md5 –

ответ

1

Похоже, что это может быть ошибка в реализации as3corelib записи битов в digestByteArray.

Это, по-видимому, записывает их в формате 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== 
    } 
+0

Привет, вы решаете мою проблему :), большое спасибо – Alex

0

Look at this.

Помните, что в исходной загрузке, указанной на этом сайте, есть несколько ошибок, поэтому вам нужно использовать исправленную версию, которую вы можете найти в том же сообщении.

Если вы используете AS3CoreLib, сделать это таким образом:

Different MD5 with as3corelib.

+0

Привет, JotaBe, я уже видел этот пост, но без успеха я забыл упомянуть, что я пытался использовать as3corelib, но ни один из способов воспроизвести тот же результат. Спасибо за вашу помощь. – Alex

+0

Отредактируйте ответ, указав на решение. – JotaBe

+0

Привет, я проверял все снова, и моя проблема в том, что я делаю MD5.hash() в AS3, я просто делаю myBytearray.toString(), и результат отличается от того, который я получаю на C#, все это тот же результат. Заранее спасибо – Alex