22

AES キーなど、小さいながらも重要な情報を Android アプリケーションに保存したいと考えています。これを行うにはどのような方法が推奨されますか? アプリケーションの一部としてキーをハードコーディングしたくありません。

KeyStoreを見ましたが、実際には問題は解決しません。パスワードを提供できれば、キーを保存できます。次に、このパスワードを保存するための安全な場所を見つける必要があります。これは、元の問題と同じです。

このタスクを実行するための組み込みの Android クラスはありますか? または、サードパーティのライブラリを探す必要がありますか? NDK の使用も許容範囲です。

アップデート:

私は、何らかの情報を保存したアプリケーションだけがその情報を取得できることを保証する、ストレージ用の Android API を見つけたいと考えていました。Android OS は、アプリケーションの署名署名に基づいてこれを強制できた可能性があります。このようにして、アプリケーションは最初の実行時にランダムなキーを生成し、後で使用するために安全なストレージに保存できます。このための API はありますか?

4

3 に答える 3

5

このタスクを実行するための組み込みの Android クラスはありますか?

以外java.io.File、いいえ。

または、サードパーティのライブラリを探す必要がありますか?

試すことはできますが、ほとんどの場合、既に拒否したソリューションのように見えると思います。ほとんどの安全なデータ ストアにはパスワードが含まれており、パスワードは別の場所 (ユーザーの頭など) に保持されていると想定されています。たとえば、OI Safeには、アプリケーションが金庫に物を保管できるようにするインテントベースのシステムがありますが、ユーザーは金庫 (IIRC) のロック解除に関与します。

于 2010-07-27T00:40:57.010 に答える
4

KeyStore APIを使用することになった場合の解決策のひとつは、アプリがKeyStoreにアクセスする必要があるたびに、実行時にパスワードを動的に生成することです。パスワードアルゴリズムを、デバイスMEID(または実行時に取得される物理デバイスの他の特定のID)などの特定のインストールに関連付けられた単純だが変更可能な変数に基づいている場合、ますます困難になるロックへのキーを提供できます選ぶ。

例:物理デバイスのIDを使用し、3つの位置にカットして、ID文字列の終了位置に追加してから、プログラムで文字列にイニシャルを追加します。このアプローチは、クラッカーがどのようにキーを作成したか(つまり、ソースコードを持っているか)を知らない限り、簡単に破ることができないセキュリティの層を提供すると思います。

MEID = MEID + "fluffy" + "2008";

MEIDがデバイスからのIDを持つ文字列である場合、「fluffy」は親友の猫の名前であり、「2008」はあなたの人生で重要なイベントの年です。次に、この新しい文字列を配列にフィードし、自分に合った番号(たとえば、運転免許証を取得した日)を解析し、3つの文字を取り出して、文字列の最後にそれらの文字をドロップします。弦の前からキーに必要な数の位置にクリップして、離れます。これはプロセッサを集中的に使用するタスクではないため、変数のフォールトトレランスコードを使用すると、システムからANRを取得する心配があまりなくても、メインプロセスでこれを実行できるはずです。本当にカエルを取得したい場合は、ある時点で文字列をビットに変換し、変更を「ビットごとに操作」します。ヴィオラ、低いオーバーヘッド、

編集:

@RedWarpが指摘したように、.apkの逆コンパイルは、適切なツールと動機を備えたオブジェクトコードの可能性の範囲内に常にあります。「キー」生成が本当に重要なプロセスである場合、アプリの範囲外でキー生成を抽象化する必要があります。

私がこの答えで言おうとしている本当のポイントは、最小限のセキュリティに関して少し前向きな考えが道を開くことができるということです。より強力なセキュリティは、私からの単純な答えよりも詳細です。

于 2011-02-08T05:51:57.437 に答える