コラム概要
■こんな方におすすめ:
Androidアプリでの署名チェックについて知りたい
Google Play Console での署名の取り扱いについて注意点を知りたい
開発/技術担当の方
■難易度:★☆☆~★★☆
■ポイント:
①今までのAndroidの署名検証(記事)について復習
②Playアプリ署名とアプリ署名鍵のアップグレードについての説明
③Androidの署名検証APIについて
④Android OS における署名検証の注意点
1.はじめに
Google Playからアプリを配信する際に署名が施されます。
この署名が変更されていないかを確認することにより、アプリに改ざんがないことを検証できます。
過去コラムにおいて、基本的な署名の検証方法について紹介しました。
「不正改造アプリ対策のための署名認証セキュリティ強化とは」
「Androidアプリ(DEXファイル)の改ざんとその対策について」
署名検証に関わる情報として、「アプリ署名鍵のアップグレード」を紹介します。
「アプリ署名鍵のアップグレード」を適用する際の署名検証の課題や、具体的な検証方法についても紹介します。
2.署名検証
本題に入る前に、署名について簡単に説明します。
署名によって個人や企業の情報を埋め込み、アプリの配信元を保証できます。
改ざんが行われると署名が無効になるため、署名を確認すればアプリの内容物に改変がないことを保証できます。
そのため、アプリの署名は、開発者が正当なアプリをリリースしたことを証明し、
アプリが改ざんされていないことを保証するために利用できます。
このように、アプリの署名は改ざん防止に役立ちます。しかし、改ざん者が元の署名を削除して自己署名すれば、Google Play 外からのインストールなどを利用して、改ざんされたアプリを使用することができてしまいます。
そのため、改ざんへ対抗するためには、アプリに署名するだけではなく、
アプリの署名そのものを検証する処理、すなわち署名検証を実装する等が必要です。
署名検証や改ざんへの対策については上記の過去記事でも紹介しているのでご確認ください。
注意点
この記事の内容は2024年11月時点の情報です。
近年、Google Play におけるアプリの署名や
「アプリ署名鍵のアップグレード」に関する仕様は、何度も変更されています。
このため、アップデートの際に思わぬ影響が出る可能性があります。
本記事の内容などを参考にされる際は、常に最新の情報に基づいてご対応ください。
また、公式ドキュメントや最新の仕様変更を定期的に確認し、適切な対応を行うようご注意ください。
3.Playアプリ署名
Google PlayにはPlayアプリ署名という機能があり、
アプリごとに事前に割り当てられたアプリ署名鍵で、Google Play がアプリの配布時にアプリに署名します。
全体としては、以下の流れで署名されます。
① 開発者がアップロード鍵でアプリに署名してGoogle Play にアップロードする
② Google Playがエンドユーザにアプリを配布する際に、Google Playのアプリ署名鍵でアプリに署名する
そのため、Google Playで配布するアプリを署名検証する際は、
アップロード鍵での署名ではなく、Google Playが行うアプリ署名鍵での署名を検証する必要があります。
例えば、署名検証を実装する場合、API Level 28 以上 (Android 9 以上)では、
以前紹介した"hasSigningCertificate"を使用して、以下のようなプログラム例になります。
下記例のプログラム上で`sha256DigestStr`として宣言されているフィンガープリントは
アップロード鍵のものではなく、アプリ署名鍵のものを使用するように注意が必要です。
「Androidアプリ(DEXファイル)の改ざんとその対策について」
public static boolean checkSignature(Context context) {
boolean signatureOK = false;
try {
String sha256DigestStr = "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"; // 図1の*1より
byte[] signature = Hex.decodeHex(tempHexStr.toCharArray());
PackageManager packageManager = context.getPackageManager();
signatureOK = packageManager.hasSigningCertificate(
"com.app.sample",
signature,
PackageManager.CERT_INPUT_SHA256
);
} catch (Exception e) {
e.printStackTrace();
}
return signatureOK;
}
4. アプリ署名鍵のアップグレード
Google Play Console では Google Play のアプリ署名鍵について、
「アプリ署名鍵のアップグレード」をリクエストすることができます。(図1の*2)
アップグレードをリクエストすると、Playアプリ署名で使用される署名が新しく追加されます。
以降、アプリを配布する際は、新たな追加分も含めた全てのアプリ署名鍵を用いてPlayアプリ署名がなされます。
また、全てのアプリ署名鍵のフィンガープリントを見るためのメニューが追加されます。(図2の*3)
5.アプリ署名鍵のアップグレード後の署名検証
ここまでで、Google Play における「アプリ署名鍵のアップグレード」について説明してきました。
「アプリ署名鍵のアップグレード」ではAPK 署名スキーム v3.1 の鍵のローテーションが利用されています。
APK署名スキームv3.1 の鍵のローテーションはAndroid 13 からサポートされており、
署名の更新に利用されます。(詳細は下記リンクを参照)
「APK 署名スキーム v3.1」Android Open Source Project
上記機能によって、一見、アップグレード後の署名のみで上書きされているように見えていても、
実際は過去も含めた全てのアプリ署名鍵による署名のチェーンのようになっています。
そのため、Android 13 以上では最新の署名でも過去の署名でも検証に使用することができます。
しかし、Android 12 以下ではAPK署名スキームv3.1 の鍵のローテーションがサポートされていないため、
アップグレード後の署名を検証に使用できません。
このことから、署名検証の処理を共通の実装にするためには、Android 12 以下との互換性を考慮し、
アップグレードをリクエストする前から存在した最初の署名(図3の*4)で検証する必要があります。
どうしても Android 13 以上ではアップグレード後の署名で検証したいという場合、
デバイスのOSバージョンを判別し、署名検証の処理を切り替えるなどの工夫が必要です。
アプリ署名鍵のアップグレードをリクエストすべきか
「そもそもアプリ署名鍵のアップグレードをリクエストすべきか」ということについての考えを述べます。
Google によれば「アプリ署名鍵のアップグレード」をリクエストする理由は次の2つです。
・暗号化を用いたより安全性の高い鍵を使用する必要がある。
・アプリ署名鍵が不正使用された。
アップグレード後は、署名の検証や管理が複雑になります。
上記のような特別な理由がない限り「アプリ署名鍵のアップグレード」をリクエストしない方が無難でしょう。
6.まとめ
本コラムでは、アプリ署名鍵のアップグレード後の署名検証について解説しました。
アプリのセキュリティ対策の一環として、署名検証の実施は重要な取り組みの一つです。
冒頭でも触れたように、Google Playにおけるアプリの署名や
「アプリ署名鍵のアップグレード」に関する仕様は、何度も変更されています。
そのため、Androidアプリで署名を取り扱う際は、こうした仕様変更の影響を受けにくい検証方法が有用です。
7. 参考
「アプリに署名」Android Developers:
https://developer.android.com/studio/publish/app-signing
「Play アプリ署名を使用する」Google Play Console ヘルプ:
https://support.google.com/googleplay/android-developer/answer/9842756
「APK 署名スキーム v3.1」Android Open Source Project:
https://source.android.com/docs/security/features/apksigning/v3-1
当サイトでは、アプリのセキュリティについて詳しくわかる資料をご用意しています。
アプリのセキュリティや対策についてご興味を持たれた方は、
ぜひダウンロードしていただけますと幸いです。
また、弊社では
アプリへの不正な解析・改ざん行為(クラッキング)を防ぐ対策製品
「CrackProof」の開発・販売を行っております。
詳しく話を聞いてみたいと思われた方は、
当サイトからお気軽にお問い合わせください。
お問い合わせはこちら