2013-12-06 2 views
0

Я пытаюсь расшифровать данные синхронизации 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? для меня. Может ли кто-нибудь дать мне совет, как продолжить это?

ответ

1

Решено. Это была проблема с кодами символов. Вместо этого:

var text = "\x00\x44\xb0\x2c\x0b"; 
var key = "\xd6\xf8\xb0\x2c\x0b"; 
hash = CryptoJS.HmacSHA256(text,key); 

я должен указать CryptoJS, что они были Latin-1 закодированные строки:

var text = CryptoJS.enc.Latin1.parse("\x00\x44\xb0\x2c\x0b"); 
var key = CryptoJS.enc.Latin1.parse("\xd6\xf8\xb0\x2c\x0b"); 
hash = CryptoJS.HmacSHA256(text,key); 

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

+0

Вы можете использовать base64_encode() для данных, чтобы избежать проблем с набором символов. – jjwdesign

0

Попробуйте это:

$text = "\x00\x44\xb0\x2c\x0b"; 
$key = "\xd6\xf8\xb0\x2c\x0b"; 
$hash = hash_hmac("sha256",$text,$key, false); 
print $hash; 

Это proabably потому что preg_ * функции имеют проблемы с этими специальными символами. И PHP поддерживает \ x12 шестнадцатеричное кодирование без каких-либо функций.

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^