NodeJS Crypto ライブラリを使用してデータの整合性を検証しようとしています。JSON 文字列の Hmac を計算する必要があります。
いくつかのテストの後、問題を突き止めることができました。Unicode 文字が含まれている場合は常に発生します。例えば:
var hasher = crypto.createHmac("sha256", 'secret_key');
hasher.write('{"timezone":"(GMT-05:00) Eastern Time (US \u0026 Canada)"}');
hasher.end();
var calculatedHmac = new Buffer(hasher.read(), 'utf8').toString('base64');
console.log(calculatedHmac);
ただし、これは間違った hmac を返します。PHP の同じコードは、サードパーティ サービスから受け取った署名と一致しました。
$data = '{"timezone":"(GMT-05:00) Eastern Time (US \u0026 Canada)"}';
$calculated_hmac = base64_encode(hash_hmac('sha256', $data, 'secret_key', true));
var_dump($calculated_hmac); // Result is correct here
NodeJS ペイロードの「\u0026」を削除すると、PHP と同じ正しい結果が得られます。
ここで何か間違ったことをしていますか?
ありがとう!