(不是这样)聪明的密钥导致Node JS中的SHA512 Hmac出现问题

时间:2013-03-14 04:53:00

标签: javascript node.js hmac sha512

这是一个古怪的问题,但我现在已经工作了好几个小时,并没有取得多大进展。我希望有人能提出建议......

我正在将脚本从php移植到节点。 php脚本使用了这个函数:

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

我已使用加密模块在节点中重现了这个:

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

我已经验证了这些函数在给出相同的文本和密钥时会产生相同的哈希值。

...除

用于php中的键的字符串看起来类似于:(不要问)

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

");

我试图在Javascript中重现这一点:

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

但它不起作用。 (我认为它必须与换行符有关)。

如下所示,用“\ r \ n”或“\ n”替换换行符也不起作用:

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

有关如何解决此问题的建议? (不幸的是,摆脱狗不是一种选择。)

先谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

为什么不存储字符串BASE64编码?这样你就不用担心换行符,空格等等。

看到您的PHP代码正确存储密钥(显然),请尝试以下脚本:

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

从命令行运行它,复制编码密钥,然后在您的javascript中使用它。 例如,解码base64字符串是一个简单的问题; Base64 encoding and decoding in client-side Javascript

答案 1 :(得分:1)

据我所知,原始字符串中没有换行符。最后的反斜杠告诉PHP下一行只是前一行的延续。为了测试我是否正确,你可以让PHP打印出字符串,看看它是否有换行符。但我怀疑你可以用Javascript中的一个长字符串或连接字符串来编写它。

答案 2 :(得分:0)

尝试在JS版本中用\n(并且没有换行符)替换PHP版本中的所有换行符。如果这不起作用,请尝试用\r\n替换它们 - 我打赌PHP不会在Windows格式的源代码中翻译多行文字:)