安全的REST服务只能由特定的Android应用程序使用

时间:2015-03-28 18:43:44

标签: android security rest rest-security

我的服务器公开了REST服务的数量,我希望安全的Web服务只能由我拥有的Android应用程序使用。

基本上,客户端(Android应用程序)和服务器都是由我开发的;我需要只将REST服务暴露给我的Android应用程序。

我想到了保护REST服务的数字方式,如

  • 使用基于用户名/密码的身份验证
  • JWT令牌
  • 基于签名的验证

在所有情况下,android app都应该在app中存储密码;在这种情况下,黑客可以轻松地反编译应用程序并获取密码。

如何保护我的REST,只能通过Android应用程序访问?

编辑: 客户端应用程序不需要用户进行任何身份验证

4 个答案:

答案 0 :(得分:2)

您可以将SSL与客户端身份验证配合使用。服务器必须知道应用程序的公钥,并且应用程序必须知道服务器的公钥。应用程序的私钥使用密钥库存储在应用程序本身中,这是一种防止反编译的安全方法,请查看https://developer.android.com/training/articles/keystore.html

<强> ALTERNATIVE:

获取应用的哈希值

public void traceKeyHash(Activity activity){
    try {
        PackageInfo info = activity.getPackageManager().getPackageInfo("your.package.here", PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.i(getClass().getName(), "Share - KeyHash: " + Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

现在你必须将你的哈希发送到你的服务器,但是......为了避免嗅探你必须加密哈希的请求。使用存储在密钥库中的私钥加密哈希,并使用服务器端的公钥解密消息,检查哈希是否与您注册的哈希匹配。

答案 1 :(得分:1)

你做不到。通过在客户端和服务器之间共享一些秘密来完成身份验证。如果你把这个秘密放在你的应用程序中,它将被反编译并被盗(如果有人关心的话)。如果您将该秘密提供给某个人(如密码),您可以对该人进行身份验证 - 但该人可以将其键入虚假应用程序。当您处理不受您控制的未知硬件时,无法确保其应用程序而非其他人 - 您只能确保用户已获得授权。

答案 2 :(得分:0)

我建议你永远不要在客户端存储密码。使用授权密钥。用户在首次验证时输入一次登录名和密码,然后服务器检查凭据并发出验证令牌。结果,客户端必须只存储令牌。

答案 3 :(得分:0)

  1. 让用户登录以发出令牌。保存令牌发行者的应用ID。
  2. 当使用令牌访问Web服务时,服务器可以验证是否确实使用appId y向用户x发出了此令牌。