Php restapi安全设计

Php restapi安全设计,php,ios,swift,rest,security,Php,Ios,Swift,Rest,Security,我制作了一个PHP rest api。我想通过IOS和Android应用程序连接到API。但我不知道如何确保一切安全 当应用程序第一次启动时,我在数据库中注册设备 表设备: id random enabled 1 12345 1 每个设备都有一个id和一个随机变量。随机值在该表中是唯一的。实际设备接收id和随机值 我现在所拥有的: 我在php端验证每个请求: private function validateUrl(){ $url = $_SERVER['REQUEST_U

我制作了一个PHP rest api。我想通过IOS和Android应用程序连接到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;
}
在我的PHP端,我可以从url获取deviceId属性。将其与数据库进行比较,检索id和随机值。MD5是它们。将其与签名进行比较。当有比赛时,一切都好。否则就不行了。这是一个可靠的实现吗


或者简单地说。我可以用id+random组合替换api密钥吗?

看起来您使用的是相同的客户端和服务器端机密,这可能是一个问题,因为任何访问*.apk或*.ipa的人都可以将其分解并找到令牌,这在开源工具中非常容易()。尤其是在安卓系统上,APK与其他一些资产几乎是一个罐子。您正在生成随机令牌客户端吗?因为它看起来是一个整数,所以只有32位的熵,不足以保证安全

通常,令牌是在服务器端而不是客户端创建的。有很多不同的方法可以做到这一点。一种是JSON Web令牌(JWT),它基本上将数据编码为id或expires数据,然后使用私钥签名。只有服务器知道私钥,因此它是创建私钥的可信源,但其他服务器可以访问公钥,公钥可用于验证令牌

如果您不想处理JWT和签名,第二个选项就是服务器端创建的不透明令牌。关键是像大UUID一样的大量熵

关于生成数学上链接的公钥/私钥对的非对称算法,有很多信息

您可以在此处阅读更多内容:

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;
}