хэш sha1 от as3crypto отличается от хеша, созданного в PHP - PullRequest
2 голосов
/ 17 февраля 2011

Создайте хеш 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 ]

2 голосов
/ 17 февраля 2011

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

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

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

напечатать "SHA:".sha1 (dechex (12345));

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

2 голосов
/ 15 апреля 2012

Правильный способ сопоставления 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 );
1 голос
/ 04 августа 2016
var sha1:SHA1 = new SHA1(); 
var src:ByteArray = new ByteArray(); 
src.writeUTFBytes("12345"); 
trace( Hex.fromArray( sha1.hash( src ) ) );

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

1 голос
/ 17 февраля 2011

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

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

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

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

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

...