アプリケーション署名

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

アプリケーション署名により、開発者はアプリケーションの作成者を特定し、複雑なインターフェイスやアクセス許可を作成することなくアプリケーションを更新できます。 Android プラットフォームで実行されるすべてのアプリケーションは、開発者によって署名される必要があります。署名なしでインストールを試みるアプリケーションは、Google Play または Android デバイスのパッケージ インストーラーによって拒否されます。

Google Play では、アプリケーション署名は、Google が開発者に対して持つ信頼と、開発者がアプリケーションに対して持つ信頼を橋渡しします。開発者は、アプリケーションが変更されずに Android デバイスに提供されていることを知っています。また、開発者は、アプリケーションの動作について責任を問われる可能性があります。

Android では、アプリケーションの署名は、アプリケーションをアプリケーション サンドボックスに配置するための最初のステップです。署名済みアプリケーション証明書は、どのユーザー ID がどのアプリケーションに関連付けられているかを定義します。さまざまなアプリケーションがさまざまなユーザー ID で実行されます。アプリケーションの署名により、明確に定義された IPC を使用しない限り、1 つのアプリケーションが他のアプリケーションにアクセスできないことが保証されます。

アプリケーション (APK ファイル) が Android デバイスにインストールされると、Package Manager は、APK に含まれる証明書を使用して APK が適切に署名されていることを確認します。証明書 (より正確には、証明書内の公開鍵) が、デバイス上の他の APK の署名に使用された鍵と一致する場合、新しい APK には、マニフェストで、他の APK と同様に UID を共有することを指定するオプションがあります。 -署名された APK。

アプリケーションは、サードパーティ (OEM、オペレーター、代替市場) によって署名されるか、自己署名されます。 Android は、開発者が外部の支援や許可なしに生成できる自己署名証明書を使用したコード署名を提供します。アプリケーションは、中央機関によって署名される必要はありません。 Android は現在、アプリケーション証明書の CA 検証を実行していません。

アプリケーションは、署名保護レベルでセキュリティ許可を宣言することもでき、異なる UID とアプリケーション サンドボックスを維持しながら、同じキーで署名されたアプリケーションのみにアクセスを制限します。共有アプリケーション サンドボックスとのより緊密な関係は、同じ開発者キーで署名された 2 つ以上のアプリケーションがマニフェストで共有 UID を宣言できる共有 UID 機能を介して許可されます。

APK 署名スキーム

Android は、次の 3 つのアプリケーション署名スキームをサポートしています。

最大限の互換性を確保するために、最初に v1、次に v2、次に v3 のすべてのスキームでアプリケーションに署名します。 Android 7.0 以降のデバイスは、v1 スキームのみで署名されたアプリよりも、v2+ スキームで署名されたアプリをすばやくインストールします。古い Android プラットフォームは v2+ 署名を無視するため、アプリに v1 署名を含める必要があります。

JAR 署名 (v1 スキーム)

APK 署名は、当初から Android の一部でした。 署名済みの JARに基づいています。このスキームの使用の詳細については、アプリの署名に関する Android Studio のドキュメントを参照してください。

v1 署名は、ZIP メタデータなど、APK の一部を保護しません。 APK 検証ツールは、信頼されていない (まだ検証されていない) データ構造を大量に処理し、署名でカバーされていないデータを破棄する必要があります。これにより、かなりの攻撃対象領域が提供されます。さらに、APK ベリファイアはすべての圧縮エントリを解凍する必要があり、より多くの時間とメモリを消費します。これらの問題に対処するために、Android 7.0 では APK 署名スキーム v2 が導入されました。

APK 署名スキーム v2 & v3 (v2+ スキーム)

Android 7.0 以降を実行しているデバイスは、APK 署名スキーム v2 (v2 スキーム) 以降をサポートしています。 (Android 9 では v2 スキームが v3 に更新され、署名ブロックに追加情報が含まれるようになりましたが、それ以外は同じように機能します)。APK のコンテンツはハッシュされて署名され、結果の APK 署名ブロックが APK に挿入されます。 v2+ スキームをアプリに適用する方法の詳細については、 APK 署名スキーム v2を参照してください。

検証中、v2+ スキームは APK ファイルを blob として扱い、ファイル全体で署名チェックを実行します。 ZIP メタデータの変更を含む APK への変更は、APK 署名を無効にします。この形式の APK 検証は大幅に高速であり、不正な変更のより多くのクラスを検出できます。

新しい形式は下位互換性があるため、新しい署名形式で署名された APK は、v1 署名されている限り、古い Android デバイスにインストールできます (APK に追加された余分なデータは単に無視されます)。

APK 署名検証プロセス

図 1. APK 署名検証プロセス

APK のファイル全体のハッシュは、APK 署名ブロックに保存されている v2+ 署名に対して検証されます。ハッシュは、v2+ 署名を含む APK 署名ブロックを除くすべてをカバーします。 APK 署名ブロックの外側で APK を変更すると、APK の v2+ 署名が無効になります。 v2+ 署名が削除された APK も拒否されます。v1 署名により、APK が v2 署名されていることが指定されているため、Android 7.0 以降では v1 署名を使用した APK の検証が拒否されます。

APK 署名検証プロセスの詳細については、APK 署名スキーム v2 の検証セクションを参照してください。