Хэш sha1 от 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?

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

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

результат: b98cfbc53daec4029895585ab198f7403d0d0506

4 ответа

Правильный способ сопоставления 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 );

Шестнадцатеричное (вы конвертируете его с Hex.toArray) значение 12345 отличается от строки "12345".

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

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

выведите "SHA:" . SHA1(DecHex(12345));

Подробнее смотрите в документации по dechex PHP.

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

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

Вывод PHP определенно правильный. Я проверил это на MySQL sha1 функция:

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

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

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

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

Другие вопросы по тегам