43

アプリの1つで使用している2つの秘密を隠そうとしています。

キーホルダーは良い場所だと理解していますが、アプリを送信する前にキーチェーンを追加することはできません。

私はこのシナリオについて考えました-

  • シークレットを他のエンティティに拡散して隠蔽することにより、アプリのCoreDataデータベースにシークレットを事前にシードします。(私はすでにそのアプリにシードDBを持っています)。
  • アプリが初めて起動したら、キーを生成してキーチェーンに移動します。
  • CoreDataからレコードを削除します。

それは安全ですか、それともハッカーはこれが起こっているのを見てそれらの鍵を手に入れることができますか?

* 3番目の編集**このシナリオを最初から説明しなかったことをお詫びします-アプリには多くのレベルがあり、各レベルにはファイル(オーディオ、ビデオ、画像)が含まれています。ユーザーはレベル(IAP)を購入できます。購入が完了したら、ファイルを自分のデバイスにダウンロードする必要があります。

iOS6の場合、ファイルはAppleの新しい「ホストコンテンツ」機能で保存されます。iOS5の場合、ファイルはAmazonS3に保存されます。

したがって、このすべてのプロセスで、2つのキーがあります。1。AppleIAPでの購入を確認するためのIAPキー。2.iOS5ユーザー向けにS3からファイルを取得するためのS3キー:

NSString *secretAccessKey = @"xxxxxxxxx";
NSString *accessKey = @"xxxxxxxxx";

それらのキーを保護する必要がありますか?レベルを購入しなくても、S3からファイルを取得できるようになるのではないかと心配しています。または、ハッカーは、すべてのレベルが事前にダウンロードされたハッキン​​グされたバージョンを作成できるようになります。

4

3 に答える 3

72

あなたの質問を複数のサブ質問/仮定に分解してみましょう:

仮定:

a)キーホルダーは安全な場所です

実際、それはそれほど安全ではありません。アプリケーションがジェイルブレイクされたデバイスにインストールされている場合、ハッカーはキーチェーンからキーを取得できるようになります

質問:

a)アプリ(AppStoreから配信されるバイナリ)にキーを入れて完全に安全にする方法はありますか?

簡単な答えはNOです。バイナリに何かが含まれるとすぐに、リバースエンジニアリングされる可能性があります。

b)難読化は役立ちますか?

はい。ハッカーがそれを理解するのに時間がかかります。アプリにあるキーの「コスト」がリバースエンジニアリングに費やす時間よりも短い場合、一般的に言って、あなたは問題ありません。

ただし、ほとんどの場合、隠すことによるセキュリティは悪い習慣です。それはあなたに安全であると感じさせますが、そうではありません。

したがって、これはセキュリティ対策の1つである可能性がありますが、他のセキュリティ対策も実施する必要があります。

c)そのような場合はどうすればよいですか?*

あなたが何をしようとしているのか背景を知らずにあなたに良い解決策を与えるのは難しいです。

例として、なぜ誰もが同じAmazon S3にアクセスできる必要があるのでしょうか?読み取り専用にする必要がありますか、それとも書き込みする必要がありますか(Kendall Helmstetter Geinが指摘しているように)。

最も安全なシナリオの1つは、次のようなものになると思います。

  • アプリケーションはパスコードで保護されている必要があります
  • アプリケーションを初めて入力すると、ユーザーにサーバーへの認証(ユーザー名とパスワードの入力)を要求します
  • これは、サーバーまたは他の認証プロバイダー(Googleなど)に対して認証されます
  • サーバーは認証トークンをデバイスに送信します(多くの場合、それはある種のCookieです)。
  • アプリケーションパスコードのハッシュに基づいてこのトークンを暗号化し、この形式でキーチェーンに保存します
  • そして今、あなたは2つのことのうちの1つをすることができます:
    • サーバーからクライアントに特定のキーを渡し(各クライアントが独自のキーを持つように)、アプリケーションパスコードのハッシュでそれらを暗号化します
    • サーバー上のS3ですべての操作を処理します(そしてクライアントに送信を要求します)

このようにして、考えられる複数の攻撃から保護します。

c)おっと....あなたが書いたばかりのものをすべて実装するつもりはありません。何ヶ月もかかるからです。もっと簡単なものはありますか?

クライアントごとに1セットのキーがあると便利だと思います。

これでも多すぎる場合は、暗号化されたキーをサーバーからダウンロードして暗号化された形式でデバイスに保存し、復号化キーをアプリにハードコードします。侵襲性は最小限で、少なくともバイナリにはキーが含まれていません。

PSケンダルとロブの両方が正しいです。

アップデート1(新しい情報に基づく)

まず、アプリ購入プログラミングガイドを見たことがありますか。

サーバー製品モデルの下に非常に優れた図面があります。このモデルは、新しいレベルを購入しなかった人から保護します。アプリケーションにアマゾンキーが埋め込まれることはなく、サーバー側は購入の領収書を受け取るときにレベルを引き渡します。

コンテンツを購入した(そしてアプリケーションからコンテンツを削除することを決定した)誰かから保護するための完璧な解決策はありません。なぜなら、数日の終わりに、アプリケーションはコンテンツをデバイスにダウンロードし、プレーンな(暗号化されていない形式で)必要になるからです。 )ある時点で。

このケースが本当に心配な場合は、すべてのアセットを暗号化して、暗号化キーと一緒にサーバーから暗号化された形式で渡すことをお勧めします。暗号化キーはクライアントごとに生成する必要があり、アセットはそれを使用して暗号化する必要があります。

これは高度なハッカーを止めることはできませんが、少なくともiExplorerを使用してファイルをコピーするだけの誰かから保護します(ファイルは暗号化されるため)。

アップデート2

更新に関するもう1つのこと1.暗号化されていないファイルを保存し、暗号化キーをどこかに(たとえばキーチェーンに)保存する必要があります。

ゲームでインターネット接続が必要な場合は、暗号化キーをデバイスにまったく保存しないことをお勧めします。アプリを起動するたびにサーバーから取得できます。

于 2013-02-14T00:12:53.533 に答える
17

書き込みに使用するS3キーをアプリに保存しないでください。短い順序では、トラフィックをスニッフィングする誰かがS3への書き込み呼び出しを確認し、短い順序では、そのキーを見つけて、好きなことを実行します。

アプリケーションが任意のセキュリティレベルでコンテンツをS3に書き込むことができる唯一の方法は、制御するサーバーを経由することです。

読み取り専用のキーである場合、つまりS3を公開して読み取ることはできませんが、書き込み機能のない読み取り専用アクセスに使用できる場合は、アプリケーションに埋め込むことができますが、プルしたい人は誰でもそれをプルできます。アウト。

プリロードされた機密データを軽く隠すために、ファイルに暗号化すると、アプリはそれをメモリに読み込んで、キーチェーンに保存する前に復号化できます。繰り返しになりますが、誰かがこれらのキーにアクセスできるようになるので、可能であればそれほど重要ではありません。

編集:

新しい情報に基づいて、コードに秘密を埋め込む方がよいでしょう。iExplorerのようなツールを使用すると、原因となるユーザーはコアデータデータベースやアプリケーションバンドル内のその他のものに簡単にアクセスできますが、オブジェクトファイルはある程度暗号化されています。ジェイルブレイクされたデバイスを使用している場合、暗号化されていないバージョンを簡単に取得できますが、意味のある文字列を見つけるのは難しい場合があります。おそらく、それらを2つの部分に保存し、コードで再アセンブルします。

繰り返しますが、それは断固としたハッカーを止めることはありませんが、ほとんどの人を締め出すには十分です。

ダウンロードできるオーバーライドシークレットがあるかどうかをサーバーに確認するコードを追加することもできます。そうすれば、シークレットが漏洩した場合、コピーされたシークレットを使用している人をシャットアウトしながら、アプリに使用されているシークレットを変更することで、すぐに対応できます。まず、ダウンロードのオーバーライドはありません。アプリケーションの更新が新しいキーを使用できるようになるまで待つ必要はありません。

于 2013-02-13T23:27:14.973 に答える
11

攻撃者に送信するコードの一部に秘密を隠す良い方法はありません。このタイプのほとんどのものと同様に、キーを保護するために無制限の時間を費やすのではなく、キーがリークしたときに問題を軽減する方法に焦点を当てる必要があります。たとえば、ユーザーごとに異なるキーを生成すると、キーが乱用されている場合にキーを無効にすることができます。または、中間サーバーを介して作業することで、プロトコルを制御できます(つまり、サーバーはキーを持っており、それを使用して特定のことを実行するだけです)。

少しわかりにくいことをするのは時間の無駄ではありません。それはいいです。しかし、それに多くの時間を費やさないでください。それがプログラムに含まれていて、それが非常に価値がある場合、それはハッキングされます。それがいつ発生するかを検出する方法と、発生したときに回復する方法に焦点を当てます。そして、可能な限り、その種の機密データを、管理している他のサーバーに移動します。

于 2013-02-13T23:10:33.790 に答える