2016-06-01 13 views
2

私は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); 
+1

通常、hmacは共有秘密鍵でハッシュされます。このキーは、この場合のパスワードに相当します。 APIにアクセスしているクライアントはキーを持っており、サーバーもそうです。 「真ん中にいる男」はすべきではない。 hmacは、送信されたメッセージが他の誰かによって変更されていないことを確認します。 –

+1

また、SSL証明書を取得するだけで、接続全体が暗号化されているため、途中の攻撃でmanに問題が発生することはありません。彼らは安くても[無料](https://letsencrypt.org/)です。 –

+0

返信いただきありがとうございます!そのすべてがSSLです。通常の操作方法は、ハッシュされたキーパラメータをクライアントに「隠す」のすべての責任を負うことです。私は誰もがクライアントのコードを検査し、jsonのURLにあるキーを乱用することができるのではないかと恐れています。これがすべて良いとしたら、息を吐きやすい=) – Havihavi

答えて

1

あなたはそれだステップ1.

事はすることができます、である、よくやりましたブラウザでのみセキュリティを守る - ユーザー名/パスワードなどの認証情報を使用して自分自身を認証すると、秘密鍵をユーザーに提供する必要があります。彼が秘密鍵を持っていれば、彼は彼の要求を認証するためにそれを使用することができます、そして、彼はもはやユーザー名/パスワードをインターウェブを渡って前後に送る必要はありません。

秘密鍵のゴールは、セッションを開始しました。セッションを開始するには、まず自分自身を認証する必要があります。そうしないと、目的を破る秘密鍵を誰かに提供することになります。

また、キーはユーザーごとに生成され、x時間後に期限切れになり、無期限に使用できなくなります。

希望すると便利です。

+0

返信ありがとうございます! =) これは、lectionへの一般的なアクセスのためのAPIになるので、ユーザー名\パスワードの認証がありません。 私は自分のネットワークと秘密のために私のクライアントにapikeyを与えます。本当にこれを保護する方法については、失われています。おそらくあなたが言うように、クライアントの管理者ユーザーの1人にログオンしてキーを取得する必要があります。 APIを操作するための重い方法のようです:¥ – Havihavi

+0

hmm ..最初にアクセスしたときにキーを入力してから、そのキーをその後のすべての要求に使用するように指示するとどうなりますか?重要なのは、ページを読み込むときに秘密鍵が表示されないことです。そうしないと、誰もがその秘密鍵を取得できなくなります。 – Alberto

関連する問題