Страницы

Поиск по вопросам

воскресенье, 12 января 2020 г.

Различные хэши одинаковых строк в node.js и php

#php #javascript #nodejs #хеширование #sha1


Для расчета хэшей в nodejs использую этот скрипт. В php использую стандартную реализацию.
Пишу алгоритм hmac для nodejs. Есть код на php, пытался его продублировать в node,
но возникла проблема при генерации хэша. 

Вот код php: `

$opad = str_repeat(chr(0x5C), 64);
$ipad = str_repeat(chr(0x36), 64);

for ($i = 0; $i < strlen($key); $i++) {

    $opad[$i] = $opad[$i] ^ $key[$i];
    $ipad[$i] = $ipad[$i] ^ $key[$i];

}

return sha1($ipad);`


Строка $ipad


  "�n�³� `�3{G�_p�#�66666666666666666666666666666666666666666666"


Коды символов 


  "248,110,215,194,179,18,221,15,32,96,224,51,123,71,220,95,112,168,35,241,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54"


Выводит "f0146b3c71d411ec5924ded1e47fe73d6db427a0".

В node код такой: 



var opad = Array(64);
var ipad = Array(64);

var opadStr = '';
var ipadStr = '';

for (var i = 0; i < key.length; i++) {

  opad[i] = key.charCodeAt(i) ^ 0x5C;
  ipad[i] = key.charCodeAt(i) ^ 0x36;

}

for(var i = 0; i < 64; i++) {
  opadStr += String.fromCharCode(opad[i]);
  ipadStr += String.fromCharCode(ipad[i]);
}

return sha1(ipadStr);




Строка ipadStr "øn׳Ýà3{GÜ_p¨#ñ66666666666666666666666666666666666666666666"`

Коды символов 


  "248,110,215,194,179,18,221,15,32,96,224,51,123,71,220,95,112,168,35,241,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54"


Выводит такой хэш "38e3f69f2d7d0cb8d6672050271a57e8448ec451".

Может, в кодировке дело.
    


Ответы

Ответ 1



Сталкивался с подобными трудностями при написание расчета md5 для js Да различие в кодировках, JS оперирует внутри UCS-2 или UTF-16, а php использует ISO-8859-1 (для работы с мультибайтными строками используются функции mb_*) PHP каждый раз после преобразованиея код->чимвол и обратно оперирует 1 символ есть 1 байт, а JS каждый раз при преобразовании код -> символ дает 2 байта Я в свое время выкрутился переездом со строк на Uint8Array

Комментариев нет:

Отправить комментарий