2017-01-05 9 views
0

私はAPIリクエストで認証を実装しようとしていますが、データの署名中に奇妙な問題が発生しています。 NodeJSのcrypto.createHmacからの出力は、PHPのhash_hmacの出力とは異なります。私はこれをPHPで実装しようとしていて、NodeJsからの応答は私が期待したものです。NodeJS crypto.createHmac SHA512が期待通りに動作しない

コードはNodeJSアプリケーション用のPHP

$signature = base64_encode(hash_hmac("sha512",$salt.'\n'.$returnUrl, $key)); 
echo $signature; 

ためNodeJS

var crypto = require('crypto'); 
var hmac = crypto.createHmac('sha512', new Buffer(key, 'base64')); 
var digest = hmac.update(salt + '\n' + returnUrl).digest(); 
var signature = digest.toString('base64'); 
console.log(signature); 

コードのために私は

応答を期待されている
VZ+gH+BVdZl6GIILfN5TFAxEIUqstiD5YwuQYTdk3R4LSxVzsAXPpPpn5MwHDoRllz5ll5iBpAOuO2DQ9nvtGA== 

を得たが、PHPは私に異なる結果を与えた

NzNlNmFhNWUwOTg2OGQ3NzdhNjU0MWZmOTZhZDZjYmFiYjE4ZjMxZTc5OTk3MDI5ZGI1M2M3YmU3MjRiYTdiNjJmODM4NDA1NmMzNWZlOWE2NTVkZjhmZTg4MDg0MjA3ZmYzMjg1MGQxYzFiZDNkODA2M2MzZGVhOTRiZWMzNTA= 

これは、予想とはまったく異なります。同じ応答を得るPHPでNodeJS暗号機能を再現できる方法はありますか?

答えて

0

次の例では、node.jsとPHPを使用して署名データを取得し、両方とも同じ出力を取得します。これを参考にすることができます。

のNode.js

var crypto = require('crypto'); 
var hmac = crypto.createHmac('sha512', 'sharedpassword'); 
var digest = hmac.update('12345\nhttps://google.com').digest('hex'); 
var signature = new Buffer(digest).toString('base64'); 
console.log(signature); 

のコードは、その後、私が手に:PHP

ため

OTllY2U2NTU4ZWVkYzczZmNlMTQ2YzdlMmI4NjI5MTdhODRhYWNmOGEyNmYzM2M5ZjQ5ZjE1NTM5MjQ1ZDAzYWU1MzlkYTViODY4MjcwM2UyMTA5MjVhMzcyNWJhOWU3OTU3MjY5NWI4ZjkzZGY1Zjg1NTNmYzI3MWU0ZTIyZWE= 

コード

$signature = base64_encode(hash_hmac('sha512', "12345\nhttps://google.com", 'sharedpassword')); 
echo $signature; 

ガット:

OTllY2U2NTU4ZWVkYzczZmNlMTQ2YzdlMmI4NjI5MTdhODRhYWNmOGEyNmYzM2M5ZjQ5ZjE1NTM5MjQ1ZDAzYWU1MzlkYTViODY4MjcwM2UyMTA5MjVhMzcyNWJhOWU3OTU3MjY5NWI4ZjkzZGY1Zjg1NTNmYzI3MWU0ZTIyZWE= 

また、二重引用符(")の場合、PHPはエスケープ文字のみを解釈します。したがって、\nは二重引用符で囲む必要があります。

関連する問題