私は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キーを置き換えることはできますか?