Android キーストアを使用してパスワードやその他の機密情報を保存する方法
ホームページホームページ > ブログ > Android キーストアを使用してパスワードやその他の機密情報を保存する方法

Android キーストアを使用してパスワードやその他の機密情報を保存する方法

Jun 03, 2024

Android Authority のアフィリエイト リンクにより、手数料が発生する場合があります。 もっと詳しく知る。

コーディングを開始する前に、Android キーストアとその機能について少し理解しておくと役立ちます。 キーストアは、パスワードなどのアプリケーション シークレットの保存には直接使用されませんが、悪意のある (権限のない) ユーザーやアプリが取得するのが非常に困難な方法で、アプリが秘密キーを保存するために使用できる安全なコンテナーを提供します。 。

その名前が示すように、アプリは複数のキーをキーストアに保存できますが、アプリが実行できるのは独自のキーの表示とクエリのみです。 理想的には、キーストアを使用すると、アプリは秘密キーと公開キーのペアを生成または受信し、キーストアに保存されます。 公開キーは、アプリ固有のフォルダーに保存される前に、アプリケーション シークレットを暗号化するために使用できます。また、必要なときに同じ情報を復号化するために使用される秘密キーも使用できます。

Android キーストア プロバイダーは API レベル 18 (Android 4.3) で導入されましたが、キーストア自体は API 1 から利用可能であり、VPN および WiFi システムでの使用に制限されています。

キーストア自体は、ユーザー自身のロック画面の PIN/パスワードを使用して暗号化されるため、デバイス画面がロックされている場合、キーストアは使用できません。 アプリケーション シークレットにアクセスする必要がある可能性のあるバックグラウンド サービスがある場合は、この点に留意してください。

サンプル アプリのメイン レイアウトは ListView で、項目はアプリによって作成されたすべてのキー (実際にはキーのエイリアス/名前) のリストで構成されます。 これは、layout/activity_main.xml として保存されます。

リストの各項目には、キーのエイリアスを表す TextView、キーを削除するボタン、およびテキストを暗号化および復号化するためのボタンが含まれています。 私たちのプロジェクトのこのlayout/list_item.xml。

List ヘッダーは、メソッドを使用して ListView に追加されます。

他のアクティビティと同様に、onCreate() メソッドから始めます。 最初に行うことは、AndroidKeyStore への参照を取得し、次を使用して初期化することです。

次に、refreshKeys() メソッド (次に説明します) を呼び出して、アプリがキーストアに保存しているすべてのキーを一覧表示します。 これにより、ListView が初期化されると、キーストア内のキーがすぐに表示されるようになります。

公開/秘密キーのペアを生成するには、KeyPairGenerator オブジェクトが必要です。 「AndroidKeyStore」で RSA アルゴリズムを使用するように設定された KeyPairGenerator のインスタンスを取得します。 generateKeyPair() を呼び出すと、新しいキーのペア (秘密キーと対応する公開キー) が作成され、それがキーストアに追加されます。

復号化は基本的に暗号化プロセスの逆です。 復号化は、キー ペアの秘密キーを使用して行われます。 次に、暗号化に使用したものと同じ変換アルゴリズムを使用して Cipher を初期化しますが、Cipher.DECRYPT_MODE に設定します。 Base64 文字列は byte[] にデコードされ、ByteArrayInputStream に配置されます。 次に、CipherInputStream を使用してデータを byte[] に復号します。 これは文字列として表示されます。

Android キーストアを使用すると、アプリ キーの作成と管理が簡単になり、アプリケーションが暗号化キーを保存するための安全で比較的安全な保管庫を提供します。 もちろん、アプリケーションとサーバー間の安全な通信を確保するために、公開キーをサーバーに送信し、サーバーの公開キーをアプリに送信することもできます。 いつものように、完全なソース コードは github で入手でき、自由に使用できます。 追加、修正、議論が必要な場合は、以下にコメントを残してください。ご意見をお待ちしております。