私はREST APIを開始しており、ハッシングと共有塩/秘密の研究を開始しています。 私はsha256ハッシュを生成することができ、json経由でサーバーに送信し、格納されたハッシュと照合しました。共有秘密鍵でAPIを保護する
これは素晴らしいことですが、私は思っています。これはjsonでこれを行いました。実際に生成されたハッシュは、それを望むすべての人にはまだ見えています。 hash_hmacを使用して文字列を再ハッシュするたびにこれらのハッシュが変更されたという印象を受けました。
どうすればランダムなユーザーがその小さなjsonスニペットを見つけて、ハッシュされたキーを取得してAPI呼び出しを開始しないようにすることができますか?
私はコンセプトを完全に誤解している可能性がありますので、どんなバンプも大歓迎です。
HERESに私の "クライアント" のページ:
<?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);
通常、hmacは共有秘密鍵でハッシュされます。このキーは、この場合のパスワードに相当します。 APIにアクセスしているクライアントはキーを持っており、サーバーもそうです。 「真ん中にいる男」はすべきではない。 hmacは、送信されたメッセージが他の誰かによって変更されていないことを確認します。 –
また、SSL証明書を取得するだけで、接続全体が暗号化されているため、途中の攻撃でmanに問題が発生することはありません。彼らは安くても[無料](https://letsencrypt.org/)です。 –
返信いただきありがとうございます!そのすべてがSSLです。通常の操作方法は、ハッシュされたキーパラメータをクライアントに「隠す」のすべての責任を負うことです。私は誰もがクライアントのコードを検査し、jsonのURLにあるキーを乱用することができるのではないかと恐れています。これがすべて良いとしたら、息を吐きやすい=) – Havihavi