(Не так)умный ключ вызывает проблемы с SHA512 Hmac в узле JS

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

я переношу скрипт с php на узел. Скрипт php использует эту функцию:

hash_hmac('sha512', $text, $key);

я воспроизвел это в узле, используя модуль crypto:

var hash = crypto.createHmac( "sha512", key );
hash.update( text );
return hash.digest( "hex" );

Я проверил, что эти функции производят тот же хэш, когда задан тот же текст и ключ.

за исключением...

строка, которая используется для ключа в PHP выглядит примерно так: (не спрашивайте)

define("SITE_KEY", "
                                           __
     ,                                   ,' e`---o
    ((                                  (  | ___,'
     ~-------------------------------' _;/
     (                                     /
     /) ._______________________________.  )
    (( (                               (( ( 
     ``-'                               ``-'

");

Я попытался воспроизвести это в Javascript следующим образом:

var key = "
                                           __
     ,                                   ,' e`---o
    ((                                  (  | ___,'
     \~-------------------------------' _;/
     (                                     /
     /) ._______________________________.  )
    (( (                               (( ( 
     ``-'                               ``-'

";

но это не работает. (Я предполагаю, что это должно иметь какое-то отношение к linebreaks).

замена новых строк на "rn " или "n", как в следующем, также не работает:

var key = "rn                                           __rn     ,                                   ,' e`---orn    ((                                  (  | ___,'rn     \~-------------------------------' _;/rn     (                                     /rn     /) ._______________________________.  )rn    (( (                               (( ( rn     ``-'                               ``-'rnrn";

предложения о том, как исправить это? (Избавляясь о собаке не может быть и речи, к сожалению.)

спасибо (заранее) за помощь.

3 ответов


почему бы не сохранить строку BASE64 в кодировке? Таким образом, вам не нужно беспокоиться о разрывах строк, пробелах, чем-то подобном.

видя, что ваш php-код хранит ключ (по-видимому) правильно, попробуйте скрипт, например:

<?
$doggy_key = ....;
echo base64_encode($doggy_key);

запустите его из командной строки, скопируйте кодированный ключ, а затем используйте его в javascript. Декодирование строк base64 является простой проблемой, например; Base64 кодирование и декодирование в Javascript на стороне клиента


насколько мне известно, в исходной строке нет разрывов строк. Обратная косая черта в конце говорит PHP, что следующая строка является продолжением предыдущей. Чтобы проверить, прав я или нет, вы можете заставить PHP распечатать строку и посмотреть, есть ли в ней разрывы строк. Но я подозреваю, что вы можете написать это в одной длинной или объединенной строке в Javascript.


попробуйте заменить все новые строки в версии PHP на \n (и без новой строки) в версии JS. Если это не сработает, попробуйте заменить их все на \r\n - бьюсь об заклад, PHP не переводит многострочные литералы в исходном формате windows:)