(Not-so)聪明钥匙导致Node JS中的SHA512 Hmac问题

这是一个古怪的问题,但我一直在这个工作几个小时,并没有取得很大的进展。 我希望这里有人能够build议…

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

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

我已经在使用encryption模块的节点中再现了这一点:

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

我已经证实,当给定相同的文本和密钥时,这些函数产生相同的散列。

除…

在php中用于键的string看起来类似于:(不要问)

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

我试图在Javascript中重现这一点,就像这样:

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

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

用下面的“\ r \ n”或“\ n”replace换行符也不起作用:

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

如何解决这个问题的build议? (不幸的是,摆脱狗不是一种select。)

在此先感谢您的帮助。

为什么不存储stringBASE64编码? 这样你就不必担心换行符,空格,等等。

看到你的php代码正确地存储密钥(显然),请尝试一个脚本,如:

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

从命令行运行它,复制编码密钥,然后在您的JavaScript中使用它。 例如,解码base64string是一个简单的问题; Base64编码和解码在客户端JavaScript

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

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