Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用我的应用程序的密钥哈希来验证来自我的应用程序的REST调用是否足够安全?_Android_Security - Fatal编程技术网

Android 使用我的应用程序的密钥哈希来验证来自我的应用程序的REST调用是否足够安全?

Android 使用我的应用程序的密钥哈希来验证来自我的应用程序的REST调用是否足够安全?,android,security,Android,Security,我有一个rest服务器,我只希望我的应用程序能够与我的rest服务器通信。也就是说,如果有人把url放在浏览器中,他们将无法与我的服务器通信 目前,我正在考虑在请求调用中添加密钥哈希作为额外参数,然后存储密钥 散列不会存储在我的应用程序中,但会使用以下方法自动检索 public static void getHashes(Activity act) { PackageInfo info; try { info = act.getPackageManager().g

我有一个rest服务器,我只希望我的应用程序能够与我的rest服务器通信。也就是说,如果有人把url放在浏览器中,他们将无法与我的服务器通信

目前,我正在考虑在请求调用中添加密钥哈希作为额外参数,然后存储密钥

散列不会存储在我的应用程序中,但会使用以下方法自动检索

public static void getHashes(Activity act) {
    PackageInfo info;
    try {
        info = act.getPackageManager().getPackageInfo("com.my.package.myapp", PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md;
            md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            String something = new String(Base64.encode(md.digest(), 0));
            //String something = new String(Base64.encodeBytes(md.digest()));
            Log.i("hash key", something);
        }
    } catch (NameNotFoundException e1) {
        Log.e("name not found", e1.toString());
    } catch (NoSuchAlgorithmException e) {
        Log.e("no such an algorithm", e.toString());
    } catch (Exception e) {
        Log.e("exception", e.toString());
    }
}
例如,我将在某个特定时间只调用一次此方法,以便我可以在logcat上看到它,并在编译到生产apk后将其保存到服务器。这意味着它不会再次输出给其他任何人看到

我会将此密钥存储在我的服务器上,每次请求时,我的应用程序都会发送此密钥。如果密钥不同,则我的服务器不会响应

这种方法安全吗?有人能看到它有缺陷吗?

不,它不安全

攻击者可以在请求中观察到此哈希的单个实例,然后将其包含在自己的请求中,而您的服务器将无法区分。例如,哈希可以由第一个获得它的人在网上发布


然而,这不仅仅是您的方法的问题:对于一般问题没有已知的安全解决方案,请参阅在WCF而不是Android的上下文中进行更全面的讨论,但论点是相同的。

否,您需要首先向服务器请求质询,然后返回应用程序密钥的哈希值、该质询、消息本身的内容(签名除外)以及应用程序和服务器端已知的一些随机字节数组。如果这样做的话,应该对网络嗅探、重播攻击免疫,并且还尝试使用合法的应用程序作为消息模板生成器进行有效身份验证,其他内容可能会被替换。您也可以用同样的方法对服务器端进行身份验证


不幸的是,在.apk文件落入攻击者手中后,几乎无法对应用程序的反向工程采取任何措施。然而,谷歌和亚马逊应用商店提供了一些保护措施,以防止使用.apk进行反汇编。

你是在使用自己的安全机制吗?是的,我看到了一个缺点。不,不安全。为什么不在Android上使用类似HMAC或OAuth2的东西呢?当有人嗅到Android流量使其工作,然后使用wget或curl向您伪造它时,会有什么损失?如果它通过电线/空气,它不是看不见的。如果使用基于服务器选择的nonce的质询响应,而不是使用固定值,您会做得更好。