我正在开发API,其中一项要求与https://developer.hotelbeds.com/docs/read/Home
相似他们的身份验证系统是
Api-Key Your registered API key
X-Signature SHA256 encoding signature
使用以下代码生成签名:
$this->signature = hash("sha256", $apiKey.trim($sharedSecret).time());
问题是:如何在服务器端验证此签名?
我已经在他们的SDK上搜索了任何内容,但time()
没有被发送到服务器。
更新
在发送请求之前延迟测试API(在请求之前120秒生成签名),它仍然有效。似乎它使用其他一些算法,然后循环30秒。
以下是带有测试的要点的链接:https://gist.github.com/ineersa/756bcbe70f339afafd7e
更新2: 进一步测试,它似乎在5分钟的范围内工作。所以它必须是600代哈希。
答案 0 :(得分:0)
首先你要知道服务器端的api密钥。 然后你必须创建一个循环,用一个定义的时间段之前的秒开始递增一个日期,比如之前的30秒和你创建散列的每个循环,并与你从客户端获得的散列进行比较。
将循环限制为您想要的秒数。 例如,如果你想有60秒
for($i=-60;$i<=0;$i++){
$token_validate = hash("sha256", $apiKey.trim($sharedSecret).strtotime(date("YmdHis",strtotime("now {$i} seconds"))));
if($token_validate==$token_sent){
break;
$somevalidationvar=true;
}
}
所有的一点是你必须知道,当生成密钥时,时间将是X,当密钥被验证时,时间将是X + Y.因此,这种方式假设例如请求不能持续超过60秒,您可以创建哈希,假设每秒从现在开始到现在的60秒,并查看是否有任何哈希值与您发送的哈希值匹配。 如果是的话,你就明白了。