1

JavascriptクライアントからPHPWebサーバーにメッセージを渡そうとしています。セキュリティの層を追加するために、データオブジェクトにハッシュで署名したいと思います。

/* Generate signature of the data with the password */
that.signEnvelope = function(data,password)
{
      return CryptoJS.SHA256(JSON.stringify(data) + password).toString();
};

これはサーバー上ですぐに崩壊します。JSON.stringify関数は、サーバー上のjson_encodeに1:1の一致する文字列を生成しないため、ハッシュを検証できません。

protected function verifySignature($remoteSignature,$data,$privateKey)
{
    /* Combine json & key samen , then sha256 */
    $localSignature = hash('sha256',json_encode($data) . $privateKey);
    return ($localSignature === $remoteSignature);
}

ハッシュ可能な文字列を生成するPHPとJavascriptの両方で実装できる別のアルゴリズムはありますか?

結論

プラットフォーム間でjson_encodeを許可することは、賢明なことではありませんでした。標準的な実装はありません。

代わりに、連結と検証がはるかに簡単な文字列のキーと値のペアを持つ配列のみを許可するようになりました。

4

2 に答える 2

1

そこで体験するのは、特定の異なるホワイトペース/改行文字に限定されません。また、文字セットが異なれば出力も異なる可能性があることにも言及する価値があります。ISO8859-15ユーロ記号の長さは1バイト、UTF8ユーロ記号の長さは3バイトであり、\u####-宣言を使用してCharをエンコードする機会が常にあります。JSON-libsは、異なるプラットフォーム上で同等の文字列を生成することを目的としていません。

それでもJSONを利用したい場合は、すべての入力で同じように動作するlibを使用するか、独自にビルドする必要があります。JSONは手動で簡単に生成できます。

于 2012-07-09T14:51:41.763 に答える
0

のJSバージョンを使用してjson_encode、1:1の一致を取得できます。

http://phpjs.org/functions/json_encode

于 2012-07-09T14:27:50.007 に答える