(Не так)умный ключ вызывает проблемы с 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:)