あなたの質問を複数のサブ質問/仮定に分解してみましょう:
仮定:
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.暗号化されていないファイルを保存し、暗号化キーをどこかに(たとえばキーチェーンに)保存する必要があります。
ゲームでインターネット接続が必要な場合は、暗号化キーをデバイスにまったく保存しないことをお勧めします。アプリを起動するたびにサーバーから取得できます。