sha1 hash из as3crypto отличается от сделанного с помощью PHP

Сделать хэш SHA1 из строки «12345» с as3crypto в as3 так же, как это делается в примере:

var sha1:SHA1 = new SHA1; var src:ByteArray = Hex.toArray("12345"); var digest:ByteArray = sha1.hash(src); trace('SHA:' + Hex.fromArray(digest)); 

результат: ec60c0fd70d82a7785f6c9a02dbe16f2e40b1344

Сделайте SHA1 из той же строки в PHP:

 print "SHA:".sha1("12345"); 

результат: 8cb2237d0679ca88db6464eac60da96345513964

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

Вопрос: Как я могу получить один и тот же хэш с as3crypto?

BTW: при тестировании я обнаружил, что другой способ с as3crypto дает мне другой (неправильный?) Результат:

 var src:ByteArray = new ByteArray(); src.writeUTF("12345"); var digest:ByteArray = sha1.hash(src); trace('SHA:' + Hex.fromArray(digest)); 

результат: b98cfbc53daec4029895585ab198f7403d0d0506

Шестнадцатеричное (вы конвертируете его с Hex.toArray) значение 12345 не совпадает с строкой «12345».

Вы конвертируете десятичное число в шестнадцатеричный массив байтов и хешируете его, а затем сравниваете его с хешем строки, сгенерированной на PHP. Они никогда не совпадут.

Если вам абсолютно необходимо сравнить два шестнадцатеричных числа вместе, то, вероятно, должно произойти изменение вашего PHP, похожего на это.

напечатайте «SHA:». SHA1 (DecHex (12345));

Дополнительную информацию см. В документации по dechex PHP.

Правильный способ сопоставления php sha1 с использованием as3crypto lib заключается в следующем:

 var src:ByteArray = Hex.toArray(Hex.fromString(srcString)); var sha1:SHA1 = new SHA1(); var hashedString:String = Hex.fromArray(sha1.hash( src )); 

Первая дополнительная функция Hex.fromString позволяет избежать десятичной конверсии, о которой говорили другие.

Примечание. Версия as3corelib намного проще: as3corelib SHA1

 var hashedString:String = SHA1.hash( srcString ); 

Результат PHP определенно правильный. Я протестировал его против функции sha1 MySQL:

 mysql> select sha1('12345'); +------------------------------------------+ | sha1('12345') | +------------------------------------------+ | 8cb2237d0679ca88db6464eac60da96345513964 | +------------------------------------------+ 

Вероятным виновником является то, что вы используете Hex.toArray() для входных данных в этой строке:

 var src:ByteArray = Hex.toArray("12345"); 

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

 var sha1:SHA1 = new SHA1(); var src:ByteArray = new ByteArray(); src.writeUTFBytes("12345"); trace( Hex.fromArray( sha1.hash( src ) ) ); 

используя writeUTFBytes , этот метод записывает строку в объект bytesarray без спецификации.