Я пытаюсь расшифровать данные синхронизации Firefox с помощью javascript, портируя одну библиотеку php, которая делает это (https://github.com/mikerowehl/firefox-sync-client-php). Идея состоит в том, чтобы декодировать данные синхронизации, не отправляя ключ синхронизации на сервер. Это просто контекст, проблема, которую я имею, более конкретна.Как получить тот же результат с PHP и CryptoJS с использованием SHA256?
Для получения некоторого кода требуется использование sha256. Я хотел бы воспроизвести его в javascript. Подход, который я пробовал, с CryptoJS, это:
PHP код:
$key = hash_hmac("sha256",'OLA K ASE','CLAVE', false);
print $key;
Эквивалент Javascript код (ранее, я включил http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/hmac-sha256.js):
var hash = CryptoJS.HmacSHA256("OLA K ASE", "CLAVE");
console.log(hash.toString());
Это прекрасно работает , В каждом случае вывод равен 9591d44df0c8e2d7a1f400f41117c536e10f58d7e28bdc1cad9d81e70290bc1b, что, я полагаю, является правильным.
Но, когда я пытаюсь кодировать строки, отличные от ascii, результаты отличаются. Например, с этим PHP код:
function hexstring($str){
return preg_replace('/\\\\x([0-9a-f]{2})/e', 'chr(hexdec(\'$1\'))', $str);
}
$text = hexstring('\x00\x44\xb0\x2c\x0b');
$key = hexstring('\xd6\xf8\xb0\x2c\x0b');
$hash = hash_hmac("sha256",$text,$key, false);
print $hash;
я 0697f5528c996006ffeb09b9130bf8e9056563245656d405e233bcafdbffb645
. Но с 'эквивалентным' кода JavaScript:
var text = "\x00\x44\xb0\x2c\x0b";
var key = "\xd6\xf8\xb0\x2c\x0b";
hash = CryptoJS.HmacSHA256(text,key);
console.log(hash.toString());
Я получаю 13c983b69f82c277815c03d13e90b1ec1e9cbca2b6912ad1f8224f3de8b82130
, другое значение.
Я думал, что это может быть вызвано не-ASCII характер, так что я сделал быстрый тест:
$text = '';
for($i = 0;$i < 10; $i++){
$text .= chr($i);
}
$key = '';
for($i = 0;$i < 10; $i++){
$key .= chr($i*2);
}
$hash = hash_hmac("sha256",$text,$key, false);
print $hash;
, а эквивалент JavaScript:
var text = '';
for(i = 0;i < 10; i++){
text += String.fromCharCode(i);
}
var key = '';
for(i = 0;i < 10; i++){
key += String.fromCharCode(i*2);
}
var hash = CryptoJS.HmacSHA256(text, key);
console.log(hash.toString());
В обоих случаях выход является c5d7adbbabcec5416c6b7a1f01e17e42d95a529f5bcc805d9b04b93f33994c9d
.
Это большой WTF? для меня. Может ли кто-нибудь дать мне совет, как продолжить это?
Вы можете использовать base64_encode() для данных, чтобы избежать проблем с набором символов. – jjwdesign