1

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 と同じ正しい結果が得られます。

ここで何か間違ったことをしていますか?

ありがとう!

4

2 に答える 2

2

エスケープ シーケンス表記は、\uXXXXバージョン 7 以降の PHP でのみサポートされています (参照)。

古いバージョンの PHP を使用している場合、これらのエスケープ シーケンスは文字通り ( \u00266 文字の部分文字列) 渡されますが、Node はそれを単一の文字 ( &) として解釈します。

Node にエスケープ シーケンスの解釈を停止させたい場合は、バックスラッシュをエスケープする必要があります。

hasher.write('{"timezone":"(GMT-05:00) Eastern Time (US \\u0026 Canada)"}');

これを行うと、Node と PHP の結果は同じ0CE0++Kn9mi5xd7nAz/mWOrr7939RWwzfxhBzxAWtAk=になります (正確には)。

于 2016-01-21T14:31:17.093 に答える