1

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

このメソッドは、たとえば特定の時間に 1 回だけ呼び出されるようにして、logcat で確認し、プロダクション apk にコンパイルした後にサーバーに保存できるようにします。これは、他の人が見られるように再度出力されないことを意味します。

このキーをサーバーに保存し、リクエストが行われるたびにアプリがこのキーを送信します。キーが異なる場合、サーバーは応答しません。

この方法は安全ですか? 誰かがそれに欠陥を見ることができますか?

4

2 に答える 2

0

いいえ、安全ではありません。

攻撃者は、このハッシュの単一のインスタンスがリクエストで送信されるのを観察し、それを自分のリクエストに含めることができ、サーバーは区別できなくなります。ハッシュは、たとえば、それを最初に取得した人によって Web 上で公開される可能性があります。

ただし、これはアプローチの問題だけではありません。一般的な問題に対する既知の安全な解決策はありません。もう少し包括的な議論については、この回答を参照ください(Android ではなく WCF のコンテキストで、議論は同じです)。

于 2013-09-02T20:36:15.143 に答える