2013-03-04 10 views
8

私はいくつかのデータをAESで暗号化する必要があるプロジェクトを持っています。しかし、私はハードコードこのような私のプロジェクトでのAESキー:誰かが私はハードコードされたAESの鍵を見つけるために私のバイナリをハックしたい場合iOS:コードでAESキーをハードコードするのは安全ですか?

NSString *passwd = @"someStringAsKey"; 
NSData *encryptedData = [Encrypter encrypteData:unencryptedData]; 

、それは簡単なことだろうか?そうであれば、AESキーを保存するにはどうすればよいでしょうか?

EDIT: キーはデータのチャンクの暗号化と復号化に使用され、アプリがサーバーからデータをダウンロードして、アプリはそれを暗号化し、ディスク上の暗号化データを保存します。 このキーはデバイス単位で使用されます。つまり、アプリケーションが実行されるたびに、キーを生成する方法を知っている限り、すべてのデバイスが独自のキーを持つことができます。

EDIT2: データのダウンロード手順は、この方法で保護されています。クライアントは、ランダムな公開鍵/秘密鍵のペアにそれがログインするたびに生成します。公開鍵をサーバに送信し、サーバは公開鍵を使用してAES鍵を暗号化し、暗号化されたAES鍵をクライアントに送信します。クライアントはAESキーを解読し、メモリに格納します。クライアントとサーバーは、そのAESキーで暗号化されたデータを転送します。

私はハッカーによって復号化されないために、ディスク上のデータを保護することを目的としたんです。私はハッカーが得ることができるのは私のバイナリイメージとディスク上のデータであると仮定します。また、ハッカーは、自分のデバイスで私のアプリを実行し、メモリを分析することができます。

私はこの種の攻撃を防御する必要はありません。ハッカーはスマートで、ウイルスがジェイルブレイクされたデバイス上で実行され、ウィルスは自分のアプリの実行中のメモリを分析してメモリ内のキーを検索できます。だから私たちはネットワーク輸送の安全性について心配する必要はありません。

+0

を?それはその一生の間、その装置にとどまっていますか?そうであれば、最初の実行時にキーを生成して何らかの形でそれを保存することで得ることができます。誰かがアプリをハッキングしても、自分が管理しているキーは自分のデバイスでのみ役立ちます。 – cHao

+0

@cHao質問を編集しました。ありがとうございます。 – CarmeloS

答えて

5

はい、見つけるのはかなり簡単でしょう。実際には、鍵をローカルに安全に保存することは不可能です。あなたが望むことができる最高のものは、難読化され、潜在的な攻撃者の努力に値するものではありません。たとえば、パスワードを迷惑文字の束でファイルに格納し、メモリ内の正しいパスワードを選び出します。パスワードは "パスワード" であると言う:

efgwhi P buobgweu egiwhip hipwgie ワットHP IPH neifgwnp Ripndpa D O(私は行っていません任意の広範な研究が、私はだと思いますブローフィッシュは、メモリバッファー上で同様の技術を使用します)

このような大きな文字列をあなたが望んでいたエンコーディング(あいまいなものはうまくいくでしょう)をしてから、ちょうどあなたが望むビットを選んで選んでください。私が見ることができる唯一の問題は、あなたが一点でそれをメモリに保存しなければならないことと、それがメモリにあるならば、私が知っている限り、特定の個人がGDBまたはLLDBでそれを得ることができるということです。これをより迷惑にならないようにするには、パスワードをNSStringNSDataとしてください)としてメモリに保存しないようにしてください。それは本当にそれの価値がなければならないでしょう。結局のところ、あなたのデータは、残念ながらiOSデバイス上で決して安全ではありません。

このファイルがサーバー上にあることが最善のシナリオです。ファイルをダウンロードし、魔法をかけて、キーチェーンにパスワードを保存し、ファイルを削除します。その後、キーチェーンの値を使用します。

私はセキュリティ専門家ではありませんが、これは私の頭にかかった最初の考えです。

EDIT私はデータを事前に暗号化していたと仮定して作業していました。あなたのアプリがサーバーからのデータを暗号化している場合、攻撃者は単にサーバーからデータをダウンロードするだけで何が止まるのでしょうか?まあ、そのためのシステムがあると仮定すると、他の答えのようなキーを生成し、それをキーチェーンの難読化された形式で保存することができます。そのようにしても、攻撃者がそれを保留にしても、しばらくそれをどうするのか分からないでしょう。

+0

jailbrokenデバイスでキーチェーンが安全ですか? – CarmeloS

+3

いいえ、キーチェーンはjailbrokenデバイスでは安全ではありません。キーチェーンからWiFiパスワードを読み取ることさえできます。したがって、キーチェーンに保存する機密データも暗号化する必要があります。 –

+0

あなたの質問に答えて編集しました – borrrden

1

が文字列としてそこにスタック、および他の保護がなければ、あなたのバイナリで鍵を見つけるために、些細なだろう。誰かが必要とするのは、シンボリックデバッガ、および/またはキーがどのように見えるか(どれくらいの大きさでなければならないか、そして有効な値の範囲)のまともな考えです。

iOSには、機密データを悪意のあるアプリの範囲外に保存できるセキュリティ機能が組み込まれているようです。問題は、デバイスの大部分が意図したとおりに動作していると思われることです。 jailbrokenされたデバイスで実行されているコードは、おそらくそのデータのすべてではないにしても、ほとんどの場合、そのコードにアクセスできます。

+1

残念ながら、これは本当です。あなたが望むことができる最高のものは難読です。 – borrrden

1
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

このメソッドは、アプリケーションの起動時にだからあなたのランダム鍵の作成に一度だけ呼び出されます。暗号化されたデータは、/から来るために起こっている

-(NSString) generateKey{ 
     char data[NUMBER_OF_CHARS]; 
     for (int x=0;x<NUMBER_OF_CHARS;data[x++] = (char)('A' + (arc4random_uniform(26)))); 
     return [[NSString alloc] initWithBytes:data length:NUMBER_OF_CHARS encoding:NSUTF8StringEncoding]; 
} 
+0

暗号化を有効にするには、通常、アプリケーションの実行の間に同じキーが必要です。つまり、キーは一般的にどこかに格納する必要があります。 (そうしないと、前のインスタンスの鍵を使って暗号化したものを解読することはできません)。どこに格納されていても、取得するのは難しくありません。 – cHao

+0

私はAppdelegateクラスの変数プロパティにこの関数を使って生成したキーを格納することでこれを行っています。 @プロパティ(強く、非原子的)NSString * oneTimeGeneratedKey; –

+0

それは、アプリが終了して再開しても生き残ることができますか?何かが私には分かりません。 (私はあまりにもiOSに精通していません。) – cHao

関連する問題