我正在启动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);
答案 0 :(得分:1)
你做得很好,这就是第1步。
事情是,你不能只在浏览器上做安全 - 你应该在用户使用他的凭证(如用户名/密码)成功验证自己后为用户提供密钥。一旦他有了密钥,他就可以用它来验证他的请求,他不再需要在互联网上来回发送他的用户名/密码..
密钥的目标是在用户启动会话后简化经过身份验证的请求。要开始会话,您需要首先验证自己,否则您将向任何人提供违背目的的密钥。
此外,密钥应该按用户生成,并在x个时间后过期,因此无法无限期使用。
希望这有帮助!