1

我正在尝试将消息从 Javascript 客户端传递到 PHP 网络服务器。为了增加一层安全性,我想用哈希对数据对象进行签名。

/* 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 Euro-Sign 是 1 个字节长,UTF8 Euro-Sign 是 3 个字节长,并且总是有机会使用 \u#### 声明对 Char 进行编码。JSON-libs 并非旨在在不同平台上生成可比较的字符串。

如果您仍想使用 JSON,则必须使用在所有输入上表现相同的库,或者构建您自己的库。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 回答