1

オンライン Web サービスと通信する Android アプリケーションを構築しています。アプリケーションのソース コードを GitHub で公開する予定です。私の個人的な Web サービスを利用する製品バージョンでは、デジタル署名された apk のみを接続できるようにしたいと考えています。

APK のキーストアを要求し、そのキーストアからユーザー名/パスワードを確認することは可能ですか?

これが不可能な場合、他にどのようにこの機能を作成できますか?

編集:

クラスCertificateを読み込んだところ、ID を確認するために公開鍵/秘密鍵を使用できるようです。しかし、私はまだ実装について確信が持てません

4

2 に答える 2

1

私はこれを使う -

    static public String getPackageFingerPrint( Context ctx ) {
        PackageManager pm = ctx.getPackageManager();
        String packageName = ctx.getPackageName();
        int flags = PackageManager.GET_SIGNATURES;

        PackageInfo packageInfo = null;

        try {
                packageInfo = pm.getPackageInfo(packageName, flags);
        } catch (NameNotFoundException e) {
                return "";
        }
        Signature[] signatures = packageInfo.signatures;

        byte[] cert = signatures[0].toByteArray();

        InputStream input = new ByteArrayInputStream(cert);

        CertificateFactory cf = null;
        try {
                cf = CertificateFactory.getInstance("X509");


        } catch (CertificateException e) {
                return "";
        }
        X509Certificate c = null;
        try {
                c = (X509Certificate) cf.generateCertificate(input);
        } catch (CertificateException e) {
                return "";
        }


        try {
            MessageDigest md = MessageDigest.getInstance("SHA1");
            byte[] publicKey = md.digest(c.getPublicKey().getEncoded());


            StringBuffer hexString = new StringBuffer();
            for (int i=0;i<publicKey.length;i++) {
                String appendString = Integer.toHexString(0xFF & publicKey[i]);
                if(appendString.length()==1)hexString.append("0");
                hexString.append(appendString);
                }


            return hexString.toString();

        } catch (NoSuchAlgorithmException e1) {
            return "";
        } 
    }

あなたのアプローチで私が目にする問題は、誰もがパッケージのフィンガープリントまたはパッケージを特定して、それを Web サービスに送信できることです。より良い可能性は、チャレンジ/レスポンス メカニズムを使用することです。Web サービスが一意のセッション トークンを送信し、アプリが共有アルゴリズムを使用して暗号化またはダイジェストし、この暗号化されたトークンを検証のためにサービスに送り返します。もちろん、そのアルゴリズムを github に公開したくないでしょう。

于 2013-08-24T04:16:20.913 に答える
0

特定のキーで署名された apk に Web サービスを制限することはできません。

apk の署名は Android OS によって検証され、デバイスが接続する Web サービスと直接共有されることはありません。キーストアから署名を読み取ってリクエストと一緒に送信したとしても、攻撃者は秘密鍵にアクセスせずに同じ署名 (同じバイト ストリームなど) を送信することができます。彼は署名済みの apk を取得し、キーストアからバイトを読み取り (または正当な要求をリッスンし)、データを台無しにするだけで済みます。

セキュリティレベルを確保するには、個々のリクエストに署名する必要があります。ただし、秘密鍵をリリース バージョン (gitHub で配布されていない鍵) に保持し、その鍵を使用してリクエストに署名すると、秘密鍵が apk の一部として配布され、簡単に抽出できるため、安全ではありません。

何らかの方法で、API が他の APK からアクセスされる可能性があります。

ただし、ライセンス トークンなどを使用するなど、別の方法で API を制限することもできます。その場合、ユーザーが有効なライセンス トークンを持っている限り、ユーザーが自分で apk をビルドしても気にしないでしょう。ライセンス トークンが悪用されて配布された場合、そのライセンス トークンの大量のトラフィックに対応し、たとえば、それ以上のリクエストをブロックすることができます。私は Google Play を使用していないので、サーバーからどれだけ検証できるかはわかりませんが、アプリケーション ライセンス ポータルは、適切なトークンを検索するための良い出発点になるかもしれません。

于 2013-08-24T04:19:38.900 に答える