8

iOSでは、ユーザーが提供したパスワードの値を次のように読んだかどうか疑問に思っていました。

NSString* strPwd = UITextField.text;

//Check 'strPwd'
...

//How to clear out 'strPwd' from RAM?

機密データをRAMに「ぶら下げ」たままにするのは好きではありません。それをゼロにする方法はありますか?

4

2 に答える 2

9

基本的にあなたは本当にできません。この正確な問題に関してAppleに提出されたバグがあります。さらに、少なくとも問題がありUITextFieldますNSString

@Leo Natanによる削除された回答でコメントを繰り返すには:

囲んでいるNSStringオブジェクトを解放しても、文字列バイトがメモリ内でゼロになるとは限りません。また、デバイスがジェイルブレイクされた場合、Appleが約束するすべてのサンドボックスは役に立たなくなります。ただし、この場合、実行中のアプリケーションの途中でランタイム全体を交換して、メモリからパスワードを取得することができるため、できることはほとんどありません。

これを要求するアップルに別のバグを提出してください。

Apple Bug Reporter

于 2013-01-12T18:14:13.620 に答える
-1

この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];

注:これがあなたの望むことをするかどうかはわかりません。これは、以前の回答を入力するときに考えたものです。現在は機能しているとはいえ、実装に依存していると思いますが、これは壊れやすいため(つまり、将来的に破損する可能性があります)、使用しないでください。

それでも、面白い練習になるかもしれません!:)

于 2015-12-01T00:48:48.803 に答える