9

アプリで一部のデータ (ユーザー セッション トークン) を暗号化する必要があります。私が目にするほとんどの例には、次のようなパスフレーズとソルトを使用してキーを生成するメソッドがあります。

public static Key generateKey(char[] passphrase, byte[] salt) {
    ...
}

私の理解では、パスフレーズを生成するための 3 つのオプションがあります。

  1. アプリが起動するたびにユーザーに入力してもらいます (ユーザーにとって迷惑です)。
  2. パスフレーズをアプリ自体にハードコードします。ユーザーにとってはより便利ですが、アプリのバイナリに与えられたパスフレーズを誰かが知ることができます。
  3. パスフレーズをランダムに生成しますが、生成されたキーをディスクに保存する必要があります。これで、キーをディスクに安全に保存する必要があるという問題に移行しましたが、これも不可能に思えます。攻撃者が生成されたキーを見つけた場合、大きな問題になります。

オプション#1は私にはうまくいきません。オプション 2 と 3 は、どうすればよいかをひどく誤解していない限り (そうであることを願っています)、本質的に欠陥があるように見えます。#1で行けない場合、これを行うための推奨される方法は何ですか? 攻撃者が飛び越えて最善を尽くせるように、難読化されたフープをたくさん入れますか?

ありがとう

4

2 に答える 2

2

「攻撃者が飛び越えて最善を尽くすことができるように、難読化されたフープをたくさん入れますか?」基本的にはい。フープのサイズと数は、作りたい硬さです。

サーバーを使用していない場合、データを難読化して暗号化するために何をしても元に戻すことができます。ただし、本当に難しくすることはできます。たとえば、一部のビデオ資産を保護するために使用した手法です。

  1. ヘッダー (MP4) の最初の 1024 バイトを、アプリの画像アセットの 1 つの中間から取得した 1024 バイトに置き換えました。いくつかのリペアラーを試しましたが、手動で行うことはできますが、ファイルを自動的に回復することはできませんでした。それで...

  2. 別の画像アセットから取得した 256 バイトの秘密鍵を使用してファイルを暗号化しました。

  3. キーが抽出されると、キーを壊すためにあらゆる種類の無意味な計算を行うアルゴリズムによってハッシュされます。

  4. コンパイル前の難読化ツールを使用しました。

私はこれをリバースエンジニアリングしようと試みましたが、それがどのように行われたかを知っていても、結果に値しない努力をするのは非常に困難です.

SO については、次のように要約された多数の議論があります。単純にコピーをやめたい場合は、それを困難にします (コスト対報酬)。データが商業的に機密性の高いものである場合、システム レベルのセキュリティ (デバイス全体の暗号化とルートなしなど) を組み合わせたサーバーが必要です。

于 2012-09-27T15:40:06.293 に答える
0

暗号化されたデータとともにソルトを保存しますが、これは秘密情報ではありません。ユーザーが入力したもの、またはある種のデバイス プロパティ ((ハッシュ) IMEI、MAC アドレスなど) のいずれかでキーを取得できます。

基本的に、誰から、なぜデータを保護しているのかを考えてください。ユーザーはこれを必要とするため、ユーザーから保護しようとしてもあまり意味がありません。これを非公開ファイルに保存すると、他のアプリはルート化されていない電話でそれを読み取ることができなくなります。ルート化された電話でそれを保護したい場合は、暗号化が役立つかもしれませんが、キーがアプリに存在するか、デバイス上の何かに基づいて導出されている限り、回復が難しくなるだけであり、不可能ではありません.

Android にはシステム全体のキーストア サービスがありますが、パブリック API はなく、変更される可能性があります。アプリが将来のバージョンで壊れるリスクを冒しても構わない場合は、それを使用してキーを保護できます。詳細はこちら: http://nelenkov.blogspot.com/2012/05/storing-application-secrets-in-androids.html

于 2012-09-28T04:18:34.550 に答える