Androidアプリで秘密鍵を保持する安全な方法

Dec 21 2020

Androidアプリでバーコード署名用の秘密鍵を保存するための最も適切な方法は何でしょうか?おそらくここのほとんどの専門家は言うでしょう-ただそれをしないでください、それは安全ではないからです...

しかし、私は「不安」のレベルと提案された解決策に対するリスクを理解したいと思います。

想定するPSコモディティスマートフォン。

PS私たちはあまり頻繁に鍵を交換することはできません。アプリバックエンドAPIは必要に応じて設計できます。ただし、永続的なインターネット接続やサーバー側での署名のバリエーションは不可能です。

回答

28 defalt Dec 21 2020 at 22:40

すべてのAndroid7以降のデバイスには、Googleアプリライセンスの必須要件としてTrusted Execution Environment(TEE)が装備されています。これは、暗号化BLOBに分離されたストレージとデータ処理を提供するハードウェアベースのキーストアです。QualcommSnapdragonおよびSamsungExynos SoCでは、TEEはARMTrustzoneに基づいています。PixelやiPhoneなどの一部のデバイスには、strongboxと呼ばれる独自の個別のTEE(GoogleのTitan MおよびAppleのT2チップ)があります。ディスクリートTEEは、ARM Trustzoneよりも分離されており、使用されるSoCから独立しています。

AndroidキーストアプロバイダーAPIを使用して

  • 秘密鍵を生成する

  • 秘密鍵を生成する

  • データに署名して検証する

  • 暗号化されたキーをインポートする

  • キーの使用についてユーザーを認証する

  • キーアテステーションを使用して、ハードウェアでバックアップされたキーペアを確認します

キーストア内に格納されているすべてのキーには、次のパラメータを設定できます。

  • エイリアス-キーを識別するために使用されます。
  • キーサイズ(API23)。
  • 目的–暗号化/復号化(API 23)。
  • 暗号化モード、アルゴリズム、およびパディング(API 23)。
  • 使用する前に、キーをキーストアで認証する必要がありますか?(API 23)。
  • 認証が成功した後にキーを使用できる期間(API 23)。
  • 新しい指紋登録時にキーを無効にする必要がありますか?(API 24)
  • キーストアでは、暗号化操作を実行する前に画面のロックを解除する必要がありますか?(API 28)
  • キーはStrongBoxハードウェアセキュリティモジュールで保護する必要がありますか?(API 28)

また、ログイン用の認証トークンの暗号化、パスワードの保存、アプリの大規模な機密データを暗号化するキーの暗号化にも使用できます。


「キーはStrongBoxハードウェアセキュリティモジュールで保護する必要がありますか?(API 28)」は、全体的なセキュリティレベルの観点から非常に重要であるように思われます。

Android 9以降の場合、アプリはを呼び出すことでキーをストロングボックスに保存するように設定できますsetIsStrongBoxBacked(true)。スローされた場合StrongBoxUnavailableException、アプリはハードウェアでバックアップされたキーストアにフォールバックする必要があります。Strongboxは、ハードウェアに裏打ちされたキーストアに影響を与える可能性のあるSoCのCPUの重大なサイドチャネルの脆弱性の影響を受けません。ハードウェアに裏打ちされたキーストアのセキュリティは、SoCのチップメーカーにかかっています。クアルコムのSecureWorldモバイルボールトのギャップのある「穴」が機密データを漏洩しました。

ハードウェアセキュリティのベストプラクティスでは、StrongBoxKeymasterを推奨しています。モジュールには次のものが含まれています。

  • 独自のCPU
  • 安全な保管
  • 真の乱数ジェネレーター。
  • パッケージの改ざんやアプリの不正なサイドローディングに抵抗するための追加のメカニズム。

Androidキーストアシステム

Androidキーストア認証はどの程度安全ですか?(時代遅れ、android 10リリース前に公開)