iOSでは、ユーザーが提供したパスワードの値を次のように読んだかどうか疑問に思っていました。
NSString* strPwd = UITextField.text;
//Check 'strPwd'
...
//How to clear out 'strPwd' from RAM?
機密データをRAMに「ぶら下げ」たままにするのは好きではありません。それをゼロにする方法はありますか?
iOSでは、ユーザーが提供したパスワードの値を次のように読んだかどうか疑問に思っていました。
NSString* strPwd = UITextField.text;
//Check 'strPwd'
...
//How to clear out 'strPwd' from RAM?
機密データをRAMに「ぶら下げ」たままにするのは好きではありません。それをゼロにする方法はありますか?
基本的にあなたは本当にできません。この正確な問題に関してAppleに提出されたバグがあります。さらに、少なくとも問題がありUITextField
ますNSString
。
@Leo Natanによる削除された回答でコメントを繰り返すには:
囲んでいるNSStringオブジェクトを解放しても、文字列バイトがメモリ内でゼロになるとは限りません。また、デバイスがジェイルブレイクされた場合、Appleが約束するすべてのサンドボックスは役に立たなくなります。ただし、この場合、実行中のアプリケーションの途中でランタイム全体を交換して、メモリからパスワードを取得することができるため、できることはほとんどありません。
これを要求するアップルに別のバグを提出してください。
このNSString
機能はありませんが(他の場所で説明されているカプセル化の理由で)、メモリへの単なるポインタである通常の古いC文字列をアプリで使用するのはそれほど難しくありません。そのポインタを取得すると、完了したら簡単に解決できます。
これは、ユーザーが入力したテキストフィールド(NSString
-sを使用し、変更することはできません)には役立ちませんが、アプリのすべての機密データをポインターベースのメモリに確実に保持できます。
私はそれを実験していません(私は現在ジェイルブレイクされたデバイスを持っていません)が、実験することも面白いかもしれませんNSMutableString
-次のようなものです:
// Code typed in browser; may need adjusting
// keep "password" in an NSMutableString
NSInteger passLength = password.length;
NSString *dummy = @"-";
while (dummy.length < passLength)
{
dummy = [dummy stringByAppendingString: @"-"];
}
NSRange fullPass = NSMakeRange(0, passLength);
[password replaceOccurancesOfString: password
withString: dummy
options: 0
range: fullPass];
注:これがあなたの望むことをするかどうかはわかりません。これは、以前の回答を入力するときに考えたものです。現在は機能しているとはいえ、実装に依存していると思いますが、これは壊れやすいため(つまり、将来的に破損する可能性があります)、使用しないでください。
それでも、面白い練習になるかもしれません!:)