
[英]How to validate signature with phpseclib, in a XML signature message?
[英]How to validate api request signature based on timestamp
我正在开发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个哈希。
首先,您必须以某种方式了解服务器端的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秒之前的每一秒,并查看是否有任何哈希与您发送的哈希匹配。 如果可以,那就知道了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.