使用後すぐに消去したい機密データがあります。現在、機密データは NSString の形式です。NSString は私の理解では不変です。つまり、データを実際にクリアすることはできません。ただし、NSMutableString は変更可能で、replaceCharactersInRange や deleteCharactersInRange などのメソッドを備えているため、より適切なようです。実装の詳細についての知識がないので、NSMutableString が私の目的に役立つかどうか疑問に思いますか?
4 に答える
NSMutableString が文字列を最適化してメモリに残そうとするのではないかと心配しています。さらに制御したい場合は、独自のメモリを割り当ててから、それを使用して NSString を作成してください。これを行うと、メモリを解放する前に上書きできます。
char* block = malloc(200);
NSString* string = [[NSString alloc] initWithBytesNoCopy:length:encoding:freeWhenDone];
//use string
memset(block, 0, 200);// overwrite block with 0
[string release];
free(block);
memset 関数を使用して c ポインターをゼロでワイプする必要がありますが、 memset 呼び出しはコンパイラーによって最適化される可能性があります。「 iOS でメモリから機密データを消去する正しい方法は何ですか?」を参照してください。
したがって、コードは次のようになります。
NSString *string = @"hi";
unsigned char *stringChars = (unsigned char *)CFStringGetCStringPtr((CFStringRef)string, CFStringGetSystemEncoding());
safeMemset(stringChars, 0, [string length]);
ただし、NSString の基になる c ポインターをクリアするときは注意してください。たとえば、デバイスで文字列に「パスワード」という単語が含まれている場合、基になる c ポインターは、システムで使用されているのと同じアドレスを再利用またはポイントするだけであり、このメモリ領域を消去しようとするとクラッシュします。
安全のために、char ポインターではなく char 配列を使用して、機密性の高い文字列を格納し、NSString オブジェクトに入れずにそれらを消去することをお勧めします。
攻撃者がメモリの内容を読み取ることができれば、あなたは困惑しているわけではありません。
-release
文字列とそれで完了です。さまざまなキャッシュで文字列の可能なコピーを削除したかどうかを知る方法はありません (画面に描画した場合など)。
おそらく、もっと重大なセキュリティの問題を心配する必要があります。