APK 署名の検証: アプリの安全性を確認する方法
Android でアプリをサイドローディングすると、自由と柔軟性が得られますが、改ざんされたアプリケーション という大きなリスクが伴います。悪意のある攻撃者は、人気のあるアプリを非公式サイトに再配布する前に、スパイウェアやアドウェアを組み込むように改変することがよくあります。ダウンロードした APK が開発者が Google Play にアップロードしたものとまったく同じであることをどうやって確認できますか?
答えはAPKデジタル署名になります。以下では、アプリの署名が実際にどのように機能するかを説明し、信頼するかどうかを決定する前に、オンライン APK 検証ツール を使用して APK のハッシュと証明書を確認する手順を説明します。
60秒バージョン:
Android はすべての APK に発行者キーを使用して署名します。電話機は、署名が既存のインストールと一致しない「アップデート」を拒否します。これが OS の主な偽装防止手段です。サイドロードされた APK を検証するには、その SHA-256 ハッシュと署名証明書のフィンガープリントを計算し、両方を信頼できる値 (既存の Play ストア インストール、開発者が公開したフィンガープリント、または既知の正常な以前のコピー) と比較します。一致は、ファイルがバイト同一であり、同じ発行者によって署名されていることを意味します。不一致は インストールしないでください を意味します。
APK署名とは何ですか?
デジタル署名は、暗号化された ID の証明です。開発者はアプリを完成させると、秘密鍵 (キーストア) を使用してアプリに「署名」します。 Android は、APK に埋め込まれた対応する公開キーを使用して、次のことを保証します。
- 誠実さ: ファイルは署名されてから変更されていません。
- 信憑性: 開発者は彼らが言うとおりの人物です。
- 更新情報: 同じキーで署名された APK のみが携帯電話上の既存のアプリを更新できます。
署名の進化: V1、V2、V3、および V4
Google は長年にわたって APK のセキュリティを継続的に改善してきました。
- V1 (Jar 署名): ZIP 内の個々のエントリに署名します。速度が遅く、特定の攻撃に対して脆弱です。
- V2 (APK 署名スキーム): ファイル ブロック全体に署名します。検証がはるかに速く、より安全です。 (Android7.0以降)
- V3 (キーローテーション): 開発者がアプリの更新を維持しながら署名キーを変更できるようにします。 (Android9.0以上)
- V4 (ストリーミング): ADB を介した増分インストール用に最適化されています。 (Android 11以降)
APK の署名をオンラインで確認する方法
私たちの APK検証ツール はハッシュを計算するだけではありません。証明書チェーンの完全な暗号化監査を実行します。使用方法は次のとおりです。
確認する手順:
- APK ベリファイア ページに移動します。
- APK または XAPK ファイルを選択します。
- 私たちのツールは、META-INF/ ディレクトリを解析し、証明書データ (.RSA、.DSA、または .EC を抽出します)。
- 分析が完了するまで待ちます (数秒しかかかりません)。
- 証明書情報: 開発者名、組織、および出身国を確認してください。
- ハッシュ を確認します。サイトに表示されている SHA-256 を、発行者が独自の公式サイト、プロジェクト リリース ページ、または署名マニフェストで公開している値と比較します。
セキュリティ警告
検証者が 「デバッグ証明書」 または Facebook や WhatsApp などの主要アプリの不明な「自己署名」エンティティを示した場合、インストールしないでください。ほぼ確実に侵害されています。
チェックサムについて(MD5、SHA-1、SHA-256)
チェックサムは、ファイル全体を表す固定長の文字列です。アプリのアイコン内の 1 つのピクセルを変更すると、SHA-256 ハッシュが完全に変更されます。
| ハッシュタイプ | セキュリティレベル | 注意事項 |
|---|---|---|
| MD5 | 遺産 | 衝突しやすい。セキュリティのためではありません。 |
| SHA-1 | 適度 | 素早い検索に今でも広く使用されています。 |
| SHA-256 | 素晴らしい | アプリ検証の最新の標準。 |
署名証明書から実際にわかること
検証者が証明書を返す場合、サイドローディングの安全性にとって重要な部分は、X.509 メタデータのカラフルな部分ではなく、少数のフィールドです。実際的には:
- 証明書の SHA-256 フィンガープリント。 これは最も重要な値であり、署名キーを一意に識別する 64 進数文字のハッシュです。同じ SHA-256 フィンガープリントを持つ 2 つの APK は、同じ秘密キーで署名されています。 これがOSのアップデートロジックにおける「署名の継続性」の意味です。
- サブジェクトの識別名。 多くの場合、CN=Some App, O=Example Inc., C=US のようなものです。攻撃者は自分の自己署名証明書の DN に任意の文字列を入れることができるため、身元証明としてではなく、ヒント として役立ちます。名前ではなく、必ず指紋を照合してください。
- 有効期間。 ほとんどの正当な公開キーは、最大 25 年の有効期間で生成されます (過去の推奨事項は 10,000 日です)。来月に期限が切れる証明書、または有効期限が既に過去と重なっている証明書は危険信号です。
- 署名アルゴリズム。 最新のアプリは SHA256withRSA または SHA256withECDSA を使用します。 MD5 は壊れています。 SHA1withRSA は非推奨になりました。 v1 / SHA-1 のみで署名された APK は、2026 年には疑わしいです。
ハッシュと署名: ほとんどのチュートリアルがスキップする違い
人々はよく「ハッシュ」と「署名」を混同します。これらは非常に異なる目的を果たし、安全な検証には次の両方が必要です。
- ハッシュ (APK 全体の SHA-256) は、ファイルのバイトが参照コピーと同一かどうかを示します。あなたのハッシュが発行者が公開したハッシュと一致する場合、そのハッシュが計算されてからそのファイルは変更されていません。ハッシュ チェックだけでは、誰がバイトを作成したかについては何もわかりません。
- サイン は、バイトの作成者、具体的には、署名証明書とペアになった秘密キーの所有者がこのファイルを作成したことを証明します。署名チェックだけでは、署名後にファイルが改ざんされているかどうかについては何もわかりません (OS はそれを検出して拒否しますが、証明書自体はファイルの内容を「認識」しません)。
サイドロード APK の場合、証明書のフィンガープリントが発行者の既知のフィンガープリント そして と一致すること、ファイルの SHA-256 がその正確なビルドに対して発行者が公開した値と一致すること、の 2 つを組み合わせることで最も強力な保証が得られます。
信頼できる参照フィンガープリントを入手できる場所
検証で最も難しいのは、比較する適切な値を知ることです。いくつかの信頼できるアプローチを、信頼性の大まかな順序で示します。
- 発行者自身の Web サイトまたはリリース ページ。 多くのオープンソース プロジェクトやセキュリティを重視するベンダーは、ダウンロードと一緒に署名証明書の SHA-256 フィンガープリントを公開しています。これがゴールドスタンダードです。
- 既存の Play ストアのインストール。 アプリが Play 管理のデバイスにすでにインストールされている場合、その証明書のフィンガープリントは、定義上、発行者のフィンガープリントになります。サイドロードされた APK のフィンガープリントをそれと比較します。 Apk Analyzer (Android Studio 内) や apksigner verify --print-certs などのツールは、インストールされた APK から直接それを読み取ります。
- このアプリにインストールした最初の APK。 アプリをしばらく使用していて、「署名の不一致」プロンプトが一度も表示されなかった場合は、古いコピーのいずれかを参照として使用できます。同じ発行者からの後続の更新では、同じキーを使用する必要があります (または、v3 を介してローテーションします。この場合、チェーンは引き続き検証します)。
- アーカイブされた公開スナップショット。 Internet Archive および同様のサービスでは、古い APK リリース ページが宣言されたハッシュとともに保存されることがあります。元の発行者ページがなくなった非常に古いビルドに役立ちます。
よくある検証の間違い
- 間違ったフィールドを比較しています。 「APK ファイルの MD5」は「証明書の MD5」と同じではありません。候補ファイルと参照には同じフィールドを使用します。
- ファイル自体のメタデータを信頼します。 APK には、マニフェストに任意のバージョン文字列、任意のパッケージ ラベル、任意の作成者タグを含めることができます。それらはどれも暗号ではありません。署名ブロックは、OS が実際に検証する唯一のものです。
- ファイルが友人から送信されたため、検証をスキップします。 「これは公式 APK です」という友人は、あなたと同じようにそれを検証していません。確認できるフィンガープリントを公開しているソースを主張します。
- 一致するフィールドが 1 つあれば十分であるとみなします。 ファイルの SHA-256 と証明書の SHA-256 フィンガープリントの両方と一致します。一方が一致するがもう一方が一致しない場合は、バイトが変更されているか、ソースが発行者になりすましていることを示します。
- 「便宜上」Play Protectを無効にします。 Play Protect はセカンドオピニオン スキャナーであり、署名検証の代替品ではありませんが、Protect は署名キーではなく内容によって既知の不正なパッケージを認識しているため、署名検証では検出できない実際のマルウェアを捕捉します。そのままにしておきます。
よくある質問 (FAQ)
Android が変更された APK のインストールをブロックするのはなぜですか?
新しい APK の署名がすでにインストールされているものと一致しないためです。これにより、ハッカーが本物の銀行アプリを偽のアプリで「上書き」することを防ぎます。
APKを変更した後に再署名できますか?
はい、ただし、異なるキー を使用することになります。 アプリは「クリーンな」スマートフォンには引き続きインストールできますが、元の開発者からのアップデートは受け取れなくなります。
証明書の固定とは何ですか?
これは、アプリがサーバーと通信する前に特定の証明書を明示的にチェックする高度なセキュリティ機能で、改ざんされたアプリは正しくインストールされている場合でも役に立たなくなります。
署名検証をすべてのサイドロードの一部にする
署名は、最新の Android セキュリティにおける重労働の多くを行っています。追加の数秒を費やして APK ベリファイア 経由でファイルを実行することは、改ざんされたアプリがインストールされる前にデバイスから遠ざける安価な方法です。