用于验证请求的哈希参数

Hash parameters to validate request

本文关键字:哈希 参数 请求 验证 用于      更新时间:2023-10-16

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

PHP 客户端通过 HTTP POST 将内容作为 JSON 发送,之后套接字服务器读取并处理此内容。 这工作正常。

现在,我的问题。 我将散列三个字段: 消息(字符串) 对象 ID(整数数组) 类型(字符串)

如何为这三个字段创建一个哈希? 当我使用 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);

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

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

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

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