如何根据时间戳验证api请求签名

时间:2016-02-16 14:13:56

标签: php api hash

我正在开发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代哈希。

1 个答案:

答案 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秒,并查看是否有任何哈希值与您发送的哈希值匹配。 如果是的话,你就明白了。