【问题标题】:REST API security designREST API 安全设计
【发布时间】:2017-01-07 20:23:15
【问题描述】:

我制作了一个 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;
}

这很好用,但如您所见,我有一个静态 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 key吗?

【问题讨论】:

    标签: php ios swift rest security


    【解决方案1】:

    看起来您正在使用相同的秘密客户端和服务器端,这可能是一个问题,因为任何有权访问 *.apk 或 *.ipa 的人都可以反汇编它并找到令牌,这很容易通过 open源工具 (https://github.com/iBotPeaches/Apktool)。尤其是在 Android 上,APK 几乎是一个带有一些其他资产的 jar。您是否正在生成随机令牌客户端?因为它看起来是一个 int,所以只有 32 位熵,不足以保证安全。

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

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

    关于生成数学关联的公钥/私钥对的非对称算法的信息很多。

    您可以在这里阅读更多内容:https://www.moesif.com/blog/technical/restful-apis/Authorization-on-RESTful-APIs/

    【讨论】:

      猜你喜欢
      • 2014-04-27
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 2012-06-16
      • 2021-02-24
      • 1970-01-01
      相关资源
      最近更新 更多