【问题标题】:Hash parameters to validate request验证请求的哈希参数
【发布时间】:2018-09-03 09:50:37
【问题描述】:

我有一个套接字服务器、编写的 C++ 和一个用 PHP 编写的 API 客户端,用于为特殊位置注册新用户。 为了验证来自 PHP 客户端的请求,我将使用带有唯一密钥的 HAMC 哈希,只有 API 客户端和套接字服务器知道。

PHP 客户端通过 HTTP POST 将内容作为 JSON 发送,然后 Socket 服务器读取并处理此内容。 效果很好。

现在,我的问题。 我有三个要散列的字段: 消息(字符串) objectIDs(整数数组) 类型(字符串)

如何为这三个字段创建一个哈希? 当我使用 JSON 时,JSON 的字符串是否可能在 PHP 和 C++(https://github.com/nlohmann/json) 或更多选项卡、空格或其他任何东西中没有相同的排序?

作为一点信息,消息可以包含任何字符。

目前我用这个

$str = "type=".$type. ";message=".$message;
foreach ($objectIDs as $index => $objectID) {
    $str .= ";objectID[" . $index . "]=" . $objectID;
}
//generate from a String a SHA256 hash with HMAC
$hash = getSignature($str);

有人告诉我这个签名不是唯一的,应该有一个特殊的消息表明系统创建了一个错误的哈希。 (但目前他无法联系到) 在我的测试中,我无法重现它。 现在我希望其他人可以帮助我。

【问题讨论】:

    标签: php c++ api http hash


    【解决方案1】:

    如果字符串相等,则哈希值相等。

    也就是说,对于散列来说,JSON 是一个糟糕的选择这一点是正确的:语义相同的 JSON 对象可以有不同的字符串表示形式。

    但是,在 Internet 上,您应该期望字符串表示也可能很复杂,具体取决于所涉及的两台计算机的区域设置。如果语言环境相同,则通常一切都很好(在任何地方选择 UTF-8 都是有效的)。但是,我希望 PHP 将字符串转换为服务器的语言环境。这可以更改字符串的位表示(类似于 JSON 问题)。因此,请确保两者都在相同的语言环境中工作,并且这种魔法永远不会干扰您的系统。

    【讨论】:

    • 谢谢,这证实了我的怀疑。但是我怎样才能为此创建一个唯一的哈希呢?
    • 嗯,这是一堆工作。因此,要么确保每个组件都使用相同的编码(例如,utf8)。 iconv 可以提供帮助...php.net/manual/de/function.iconv.php
    • 不,我认为编码不是问题。我的问题是,我应该可以发送带有, 示例的消息,然后散列是不确定的。用户说。我等到他把我要求的例子发给我。不过谢谢你的回答。
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2012-08-21
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多