MD5 из String в ActionScript возвращает неверные результаты, когда какой-либо шестнадцатеричный код является частью строки (например, «abc \ xBF \ x4E») - PullRequest
0 голосов
/ 09 февраля 2010

Я пытаюсь сделать MD5-строку в ActionScript с использованием алгоритма MD5, созданного Adobe и являющегося частью AS3corelib. (http://as3corelib.googlecode.com/svn/trunk/src/com/adobe/crypto/MD5.as).

Я сравниваю это с MD5, созданным в php, который, я знаю, является правильным.

Если я создаю MD5 с использованием AS и PHP, скажем, для строки типа «abcd1234», они оба равны, как и следовало ожидать. Проблема в том, что когда моя строка содержит некоторое шестнадцатеричное число, то есть «abcd \ x28 \ xBF \ x4E», MD5 из ActionSCript и php возвращают разные значения.

Теперь действительно странная часть до тех пор, пока шестнадцатеричное число находится в форме числа, когда ее строка - ее штраф и все еще совпадает:

е

"abcd \ x28 \ x46" будет иметь совпадающие значения из MD5 AS и php MD5. В то время как «abcd \ x28 \ xBF» выдаст разные хэши.

У кого-нибудь есть идеи? Я тщательно протестировал php MD5 и знаю, что он правильный, а код ActionScript неверный. Я ценю помощь, спасибо за чтение, и я прошу прощения, если это сбило с толку. Я нуб, когда дело доходит до строкового кодирования, представления и т. Д. Спасибо, Дрю С.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2010

Ваша вторая проблема связана с тем, что строки обычно определяются как буферы с нулевым (или нулевым) завершением.

Однако есть обходной путь. iso-8859-1 определяет 256 возможных символов (включая символ NUL). Первые 256 кодовых точек в UTF такие же, как в iso-8859-1 (кодировка может отличаться, если вы используете UTF-8, UTF-16 и т. Д., Но кодовые точки такие же, как и при кодировании этих кодовых точек).

Итак, если вы знаете, что все кодовые точки в вашей строке будут в диапазоне 0-255 (так как это latin1), и вы знаете, что встраивать NUL можно, вы можете вручную перебрать вашу строку, получить кодовую точку каждого символа и сохранить его как байт в вашем буфере. Как то так:

var s:String = "abc\x00d\x28\xBF";
var buffer:ByteArray = new ByteArray();
var len:int = s.length;
for(var i:int = 0; i < len; i++) {
    buffer.writeByte(s.charCodeAt(i));
}

//  trace it
buffer.position = 0;
while(buffer.bytesAvailable) {
    trace("0x" + buffer.readUnsignedByte().toString(16));
}
0 голосов
/ 09 февраля 2010

Скорее всего, PHP и ActionScript используют разные кодировки для строк; один, вероятно, использует ISO-8859-1, а другой использует UTF-8.

Для abcd\x28\xBF значения:

  • fcfebaeb81afe401c4b608dc684ad08f по ISO-8859-1
  • 47ef883a009ddbe01711ece0a0a8764e под UTF-8

А для abcd\x28\xBF\x4E (ваш другой пример) значения:

  • ea382d63efca32d8d7861a314a6112e3 по ISO-8859-1
  • dc11cdbaa05aa41640a821fb8e290eae под UTF-8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...