2013-01-12 11 views
8

iOS, zastanawiałem się, czy powiedzieć czytam pod warunkiem hasło użytkownika wartość jako takie:Bezpiecznie wyzerować pamięć NSString

NSString* strPwd = UITextField.text; 

//Check 'strPwd' 
... 

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

ja po prostu nie lubię pozostawiając dane wrażliwe „wiszące” w pamięci RAM. Masz pomysł, jak to wyzerować?

Odpowiedz

9

Zasadniczo nie możesz. W tym dokładnym wydaniu są zgłoszone błędy Apple. Dodatkowo występują problemy z co najmniej UITextField i NSString.

Powtórzmy komentarz w obecnie usunięty Odpowiedź @Leo Natana:

Zwolnienie NSString otaczającej obiekt nie gwarantuje ciąg bajtów zer w pamięci. Ponadto, jeśli urządzenie jest jailbreak, wszystkie obiecane przez Apple Apple Sandboxing będzie bezużyteczne. Jednak w tym przypadku, niewiele można zrobić, ponieważ można zamienić cały środowisko wykonawcze w trakcie działania aplikacji, co powoduje pobranie z pamięci hasła .

Proszę złożyć kolejny błąd z prośbą o jabłko, tym więcej, tym lepiej.

Apple Bug Reporter

+0

Wow. Dziękuję Ci. – wolfrevokcats

0

Podczas NSString nie ma takiej możliwości (z przyczyn hermetyzacji wymienionych gdzie indziej), to nie powinno być zbyttrudno mieć aplikacja regularne starych C-ciągi, które są tylko wskaźniki do pamięci. Gdy już to wskażesz, dość łatwo będzie wyczyścić rzeczy po zakończeniu.

to nie pomoże z tekstowych pól wprowadzonych przez użytkownika (które używają NSString -s i nie możemy ich zmienić), ale z pewnością można zachować wszystkie poufnych danych w aplikacji w pamięci wskaźnika opartego.

nie eksperymentowali z nim (nie mam prądu urządzenia jailbroken), ale również może być interesujące eksperymenty z NSMutableString - coś jak:

// 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]; 

UWAGA: nie mam pomysł, jeśli robi to, co chcesz; to jest coś, o czym myślałem, pisząc moją wcześniejszą odpowiedź. Nawet jeśli działa teraz, myślę, że to zależy od implementacji, która jest delikatna (co oznacza: z zastrzeżeniem łamania w przyszłości), więc nie powinna być używana.

Mimo to może być interesującym ćwiczeniem! :)

+0

Wymaga to, aby nikt inny nie nazywał się "hasłem", co jest niemożliwe do zagwarantowania, szczególnie biorąc pod uwagę, że środowisko wykonawcze ObjC może pozwolić ci przechwycić prawie wszystko – Alexander

Powiązane problemy