2013-02-08 9 views
19

私は自分のアプリケーションの1つで使用している2つの秘密を隠そうとしています。iOSアプリケーションのセキュリティで保護されたキーは安全ですか?

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

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

  • 前にそれらをあいまいにし、他の事業体でそれらを広げて私のアプリのCoreDataデータベースの秘密をシードします。 (私はすでにそのアプリにシードDBを持っています)。
  • アプリが初めて起動すると、生成してキーチェーンに移動します。
  • CoreDataからレコードを削除します。

これは安全ですか、ハッカーがこれを見て、そのキーを取得できますか?

* THIRD EDIT ** 最初からこのシナリオを説明してくれないことを申し訳ありません。 - アプリケーションには複数のレベルがあり、各レベルにはファイル(オーディオ、ビデオ、画像)が含まれています。ユーザーはレベル(IAP)を購入することができ、購入が完了した後、ファイルをデバイスにダウンロードする必要があります。

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

このように、私は2つのキーを持っています: 1. Apple IAPで購入を確認するためのIAPキー。 iOS5をユーザーのためにS3からファイルを取得するための 2. S3キー、:

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

は、私は全くこれらのキーを保護する必要がありますか?私は人々がレベルを購入してS3からファイルを入手できるようになることを恐れている。または、ハッカーは、内部で事前にダウンロードされたすべてのレベルでハッキングされたバージョンを構築することができます。

+0

秘密はどのように使用されていますか?クライアントとサーバーの間の通信ですか?デバイスにファイルを安全に保管していますか?何かを確保する理由を知ることで、それを達成するための最良の方法を示唆することができます。 – WDUK

+0

@WDUK追加されたデータ – shannoga

+0

これらのS3キーを保護するために_WHY_に関する情報を追加できますか?これらのファイルにあなたのアプリのユーザーだけがアクセスできるようにしたいと正しく理解していますか?あなたはIAPを通じてこれらのファイルへのアクセスを販売していますか?人々は有料でダウンロードして使用することを心配していますか? –

答えて

38

私は複数のsubquestions /仮定に質問を打破してみましょう:

仮定:

a)のキーホルダーは、実際に、それは安全ではありません安全な場所

です。

a)に配信されます(アプリにバイナリいくつかのキーを配置する方法があります:アプリケーションがjailbrokedデバイスにインストールされている場合、ハッカーは、キーチェーンから

質問をあなたの鍵を取得することができますフォームAppStore)と完全に安全ですか?

短い答えはNOです。バイナリに何かがあるとすぐに、リバースエンジニアリングすることができます。

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

はい。それはハッカーがそれを理解する時間を増加させるでしょう。アプリ内にあるキーがリバースエンジニアリングに費やす時間よりも「コストがかかる」場合は、一般的に言えば、あなたは良いことです。

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

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

C)私はこのような場合に何をすべきでしょうか?*

それは何をしようとする背景を知らなくてもあなたに良い解決策を与えることは難しいです。

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

私が最も安全なシナリオの一つは、そのようなものになるだろうと信じて:あなたのアプリケーションは、パスコードは、それが(自分のユーザー名を入力し認証するためにユーザに要求し、あなたのアプリケーションを入力し

  • まず時間を保護する必要があります

    • パスワード)をサーバーに送信
    • これは、サーバーまたは他の認証プロバイダ(例としてGoogle)に対して認証します。
    • サーバーは認証トークンをデバイスに送信します(かなりの種類のCookieです)。
    • あなたは、アプリケーションのパスコードのハッシュに基づいて、このトークンを暗号化し、このフォーム
    • でキーチェーンに保存そして今、あなたは、2つのいずれかを行うことができます:サーバーからクライアントに特定のキーの上に
      • 手を(ので、各クライアントは、独自のキーを持つことになります)、アプリケーションのパスコードのハッシュ
      • ハンドルにそれらを暗号化し、サーバー上のS3とのすべての操作を(して送信するためにクライアントが必要な)

    このようにして、複数の可能性のある攻撃から保護します。

    c)Whoooa ....私は数ヶ月かかるので、あなたが書いたものをすべて実装するつもりはありません。何か簡単ですか?

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

    これでもあまりにも多すぎると、サーバーから暗号化された鍵をダウンロードし、暗号化された形式でデバイスに保存し、解読鍵をアプリにハードコードします。私はそれが最小限に侵略的で、少なくともバイナリにはキーがないと言うでしょう。

    P.S.ケンドールとロブの両方が正しいです。

    (新しい情報に基づいて)Update 1のすべての

    まず、あなたはin app purchase programming guideを見てきました。

    サーバー製品モデルの下に非常に良い図があります。このモデルは、新しいレベルを購入しなかった誰かを守ります。あなたのアプリケーションにはアマゾンキーが組み込まれておらず、サーバー側は購入の領収書を受け取るときにレベルを渡します。

    コンテンツを購入したユーザー(アプリケーションからそれを外すことに決めた人)からの保護のための完璧なソリューションはありません。アプリケーションの終了時にデバイスにダウンロードされたコンテンツがあり、ある時点で平らな(暗号化されていない形式)。

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

    これは高度なハッカーを止めることはありませんが、少なくともiExplorerを使用して誰かからファイルを保護します(暗号化されるため)。あなたは(キーチェーンに例として)どこかのファイル暗号化されていないとストア暗号化キーを格納する必要があり、更新1.に関する

    アップデート2

    もう一つ。

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

  • +0

    Roninnを編集 - 私の質問 – shannoga

    +0

    2shannoga編集:更新された答えを参照してください –

    +0

    @shannogaを:私は​​、更新2について更新2. –

    4

    攻撃者に送信したコードに秘密を隠す良い方法はありません。このタイプのほとんどの場合と同様に、キーを漏らしたときに問題を緩和する方法に集中する必要があります。たとえば、ユーザーごとに異なるキーを生成することで、不正に使用されているキーを無効にすることができます。または、仲介サーバーを介して作業することで、プロトコルを制御することができます(つまり、サーバーにはキーがあり、特定のことを行う意思があるだけです)。

    少し難読化するのは時間の無駄ではありません。それはいいです。しかし、それに多くの時間を費やしてはいけません。それがプログラムの中にあり、それが非常に貴重であれば、それはハッキングされるでしょう。それがいつ起こるのかを検出する方法と、それが起きたときに回復する方法に焦点を合わせます。できるだけ多くの種類の機密データを、管理する他のサーバーに移動します。

    8

    あなたのアプリに書き込みに使用されるS3キーを保存しないでください!短期間では、トラフィックを傍受している人は、S3への書き込み呼び出しを見て、短い順序でそのキーを見つけ出し、好きなことをします。

    アプリケーションがS3にコンテンツを書き込むことができるのは、管理するサーバーを経由することだけです。

    読み取り専用で使用する鍵であれば、S3を一般公開することはできませんが、鍵は書き込み不可能な読み取り専用アクセスに使用できるため、アプリケーションに埋め込むことができますそれを引き出すことができます。

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

    編集:新しい情報に基づいて

    あなたはおそらくコードに秘密を埋め込むほうが良いでしょう。因果関係のあるユーザーは、iExplorerのようなツールを使用して、アプリケーションバンドルのコアデータデータベースなどに簡単にアクセスできますが、オブジェクトファイルは暗号化されています。彼らがjailbrokenデバイスを持っていれば、暗号化されていないバージョンを簡単に手に入れることができますが、意味のある文字列を見つけるのは難しいかもしれません。おそらく2つの部分に格納し、コードで再アセンブルします。

    また、決まったハッカーを止めることはありませんが、ほとんどの人を忘れてしまうほどです。

    サーバーに尋ねようとするコードを追加して、ダウンロードできるオーバーライドシークレットがある場合は、そのコードを追加することもできます。そうすれば、秘密が漏れた場合、コピーされた秘密を使っている人は誰も止めることができます。まず、ダウンロードするオーバーライドはありません。新しいキーを使用できるようにアプリケーションの更新を待つ必要はありません。

    +0

    は私の質問 – shannoga

    関連する問題