使用共享密钥保护API

时间:2016-06-01 23:04:46

标签: php hash

我正在启动REST API,并且已经开始研究哈希和共享盐/秘密。 我已成功生成sha256哈希,通过json将其发送到我的服务器并将其与存储的哈希匹配。

这很好,但我想,现在我已经用json完成了这个,生成的实际哈希仍然对每个想要它的人都可见。每次使用hash_hmac重新散列字符串时,我都觉得这些哈希值已经改变了。

那么我如何确保随机用户不会找到那个小json片段,抓取哈希键并开始进行API调用?

我可能完全误解了这个概念,所以非常感谢任何颠簸。

见下我的“客户”页面:

<?php
$key= hash_hmac('sha256', '66c74620db28603fe4bec7b0f3a8e53b', 'gwerganaevawe21_3faseghbamoirvQWD');
?>
<script>
$.getJSON( "domain.com/api/publicCourseSession.php?key=<?php echo $key;?>", function( data ) {
  $.each( data, function( key, val ) {
   console.log(val);
  });
});
</script>

这是我的publicCourseSession.php:

  header("Content-Type: application/json");
    header('Access-Control-Allow-Origin: *');
    $apikey =$_GET['key'];
    session_start();
    function hash_compare($a, $b) { 
        if (!is_string($a) || !is_string($b)) { 
            return false; 
        } 

        $len = strlen($a); 
        if ($len !== strlen($b)) { 
            return false; 
        } 

        $status = 0; 
        for ($i = 0; $i < $len; $i++) { 
            $status |= ord($a[$i]) ^ ord($b[$i]); 
        } 
        return $status === 0; 
    } 
    $currentnetwork = getCurrentNetwork();
    $currentkey = getNetworkApiKey(getNetworkId($currentnetwork));
    $currentsecret = getNetworkApiSecret(getNetworkId($currentnetwork));
    $currentkey= hash_hmac('sha256', $currentkey, $currentsecret);
    if (hash_compare($apikey,$currentkey)) { 
        $status='correct';
    } else {
        $status='not correct';
    }   

    $arr[] = ["key"=>$apikey, "currentkey"=>$currentkey, "correctkeys"=>$status];
    echo json_encode($arr);

1 个答案:

答案 0 :(得分:1)

你做得很好,这就是第1步。

事情是,你不能只在浏览器上做安全 - 你应该在用户使用他的凭证(如用户名/密码)成功验证自己后为用户提供密钥。一旦他有了密钥,他就可以用它来验证他的请求,他不再需要在互联网上来回发送他的用户名/密码..

密钥的目标是在用户启动会话后简化经过身份验证的请求。要开始会话,您需要首先验证自己,否则您将向任何人提供违背目的的密钥。

此外,密钥应该按用户生成,并在x个时间后过期,因此无法无限期使用。

希望这有帮助!