2017-01-07 18 views
0

私はPHPの残りのAPIを作成しました。私は、IOSとAndroidアプリを介してAPIに接続したいと思います。しかし、私はすべてを確保する方法を知らない。REST APIのセキュリティ設計

は、私は私のデータベースにデバイスを登録する際に最初にアプリが起動

表デバイス:

id random enabled 
1 12345 1 

すべてのデバイスは、IDとランダムを持っています。ランダム値はそのテーブル内でユニークです。実際のデバイスはidとランダム値を受け取ります。私が今持っている何

私は、PHP側で各要求を検証:

private function validateUrl(){ 
     $url = $_SERVER['REQUEST_URI']; 
     $signature = isset($_GET['signature']) ? $_GET["signature"] : null; 
     $url = str_replace('&signature=' . $signature, '',$url); 
     $url = "" . $url; 
     $correctSignature = md5($url . "TNynVX9k2HqYSXnd"); 

     if($signature != $correctSignature){ 
      echo die(json_encode([array('status' => "not valid")])); 
     } 
    } 

IOS側(この場合)でリクエスト:

private func random() -> Int { 

    var result = ""; 

    for _ in 1...3 { 
     let randomNumber = arc4random_uniform(99) 
     result += String(randomNumber); 
    } 

    return Int(result)!; 
} 

private func md5(string string: String) -> String { 
    var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0) 
    if let data = string.dataUsingEncoding(NSUTF8StringEncoding) { 
     CC_MD5(data.bytes, CC_LONG(data.length), &digest) 
    } 

    var digestHex = "" 
    for index in 0..<Int(CC_MD5_DIGEST_LENGTH) { 
     digestHex += String(format: "%02x", digest[index]) 
    } 

    return digestHex 
} 

func createUrl(url : String) -> String { 
    var newUrl = url; 
    newUrl += "?&random=\(random())"; 
    let secret = "TNynVX9k2HqYSXnd" 
    let signature = md5(string: newUrl + secret) 

    newUrl += "&signature=" + signature; 

    return newUrl; 
} 

この素晴らしい作品ですが、私は静的なAPIキーがあります。何か私が懸念しているところ。だから私はおそらく私のIDと私のデータベースからランダムに基づいてAPIキーを作成することができると思った。それはより安全ですか?

func createUrl(url : String) -> String { 
    var newUrl = url; 

    let signature = md5(string: [device id here] + [device random here]) 

    newUrl += "&signature=" + signature; 
    newUrl += "&deviceId=" + [device id here]; 

    return newUrl; 
} 

そして、私のPHP側で私はURLからDeviceIDプロパティを取得することができますよう

何か。それをデータベースと比較し、IDとランダム値を取得します。それらをMD5。それを署名と比較してください。そして試合があるときは大丈夫です。そうでなければ。それは実践的な実装ですか?

簡単な言葉で言えば、 id + randomの組み合わせでapiキーを置き換えることはできますか?

答えて

1

* .apkまたは* .ipaにアクセスできる人は、それを分解してトークンを見つけることができるので、同じ秘密のクライアント側とサーバー側を使用しているようですオープンソースツール(https://github.com/iBotPeaches/Apktool)。特にAndroidの場合、APKは他の資産とほとんど同じです。あなたはランダムなトークンのクライアント側を生成していますか?それはintであるように見えるので、それは32ビットのエントロピーであり、安全であるには十分ではありません。

通常、トークンはクライアント側ではなくサーバー側で作成されます。これを行うにはさまざまな方法があります。 1つはJSON Webトークン(JWT)で、基本的にIDのようなデータをエンコードしたり、秘密鍵で署名されたトークンにデータを期限切れにします。サーバーだけが秘密鍵を知っているので、それを作成するための信頼できるソースですが、他のユーザーはトークンの検証に使用できる公開鍵にアクセスできます。

JWTと署名に対処したくない場合、2番目のオプションはサーバー側で作成された単なる不透明トークンです。鍵は、大きなUUIDのような大量のエントロピーです。

数学的にリンクされた公開鍵/秘密鍵のペアを生成する非対称アルゴリズムに関する多くの情報があります。

詳細はこちらhttps://www.moesif.com/blog/technical/restful-apis/Authorization-on-RESTful-APIs/

関連する問題