Pytanie Wymaż dane pęku kluczy, jeśli urządzenie jest uszkodzone w więzieniu


Obecnie mam aplikację, która ma opcję "Zapamiętaj mnie" do przechowywania ID użytkownika. Aby ją teraz przechowywać, używam API Keychain.

Ale mam wątpliwości, czy przez przypadek urządzenie zostało skradzione i ktoś jailbreak urządzenie. Czy uda mu się uzyskać wszystkie te dane z pęku kluczy?

Jak temu zapobiec?


11
2018-03-03 05:44


pochodzenie




Odpowiedzi:


Najważniejszą rzeczą przy korzystaniu z KeyChain jest nieużywanie kSecAttrAccessibleAlways lub kSecAttrAccessibleAlwaysThisDeviceOnly ponieważ wtedy dane nie są bezpiecznie szyfrowane (patrz Dokumentacja Apple). Niewykorzystywanie tych danych zwiększa bezpieczeństwo danych KeyChain, ale mimo to użytkownik będzie wymagał silnego hasła, aby chronić swoje dane. Jeśli użytkownik nie ma kodu dostępu do urządzenia, dane nie są chronione. Jeśli użytkownik ma 4-cyfrowy kod dostępu (standard), dane są bardzo słabo chronione i mogą być brutalnie wymuszone w ciągu kilku minut.

Jeśli potrzebujesz ochrony przed jailbreak (i ​​innymi atakami), najlepszym wyjściem jest nie używanie KeyChain, ale utworzenie własnego, zaszyfrowanego wrażliwego magazynu danych i wymaganie od użytkownika posiadania bezpiecznego kodu dostępu. Przechowuj dane zaszyfrowane za pomocą klucza wygenerowanego z tego kodu.

Może to powodować niedogodności dla użytkowników, więc jeśli chcesz podać okres prolongaty między wymaganiem hasła, zastanów się, w jaki sposób udostępnić plik cookie sesji dla aplikacji, który jest unieważniany po określonym czasie.


8
2018-03-08 15:28



Czy SQLCipher może być rozwiązaniem dla tego rodzaju problemów? - raaz
@raaz Tak, może być, ale to zależy, czy naprawdę potrzebujesz tak dużego framework (SQLite + sqlcipher). - Leo Natan
Leo-natan, czy masz jakieś sugestie komercyjne lub otwarte? - raaz
@raaz Rzuć okiem na ten projekt: github.com/nicerobot/objc/tree/master/NSData/NSData%2BAES Podaje kategorie szyfrowania powyżej NSData. Teraz możesz użyć dowolnego obiektu, który może być serializowany do danych (takich jak słownik) i ukryć go przed zapisaniem na dysku. - Leo Natan
Leo Natan dzięki, sprawdzę to. - raaz


Aby być bardziej bezpiecznym, dodałbym jeszcze jedną warstwę bezpieczeństwa i sprawdziłbym, czy urządzenie jest jailbreak. W takim przypadku usunę dane bieżące KeyChain \ sensitive.

Coś w tym stylu:

NSString *filePath = @"/Applications/Cydia.app";
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
   //Device is jailbroken --> delete KeyChain
}

Albo jeszcze lepiej:

FILE *f = fopen("/bin/bash", "r");
BOOL isbash = NO;
if (f != NULL)
{
    //Device is jailbroken --> delete KeyChain
    isbash = YES;
}
fclose(f);

1
2018-03-09 08:21



To okropny pomysł. Po pierwsze, wszystkie te mogą być łatwo ominięte. Tylko dlatego, że urządzenie jest jailbreak, nie oznacza, że ​​aplikacja nie jest w piaskownicy. Twój pierwszy przykład to nada. Bash nie zawsze jest instalowany. W rzeczywistości większość ludzi go nie instaluje. Drugi przykład - nada. Usunięcie pęku kluczy nastąpiłoby tylko wtedy, gdy aplikacja jest uruchomiona. W międzyczasie jailbreak umożliwia dostęp do danych pęku kluczy. - Leo Natan
Powyższe są typowymi metodami wykrywania, czy twoje urządzenie jest jailbreak. Sprawdź tutaj: stackoverflow.com/questions/413242/... . Btw, drugim przykładem jest to, jak Skype to robi (daleko od "nada"). Oczywiście aplikacja musi działać, aby mogła działać. Dlatego napisałem "dodaj kolejną warstwę bezpieczeństwa", nie zależą tylko od powyższego. - Segev
Tak, są to powszechne sposoby na uzyskanie fałszywej nadziei. Są bardzo niewiarygodne. Nie należy tu mieć nieporozumień - jeśli chcą ochrony poza jailbreakiem, muszą sami ją wdrożyć poza systemem operacyjnym. - Leo Natan
Kluczem jest tu obrona w głębi, tak, to nie są niezawodne mechanizmy wykrywania jailbreaków, ale dla prostego fragmentu kodu dodaje ona warstwę obrony, która pomoże w pewnych okolicznościach. - Tim
@Jeff Tak, ale czy lepiej nie robić najlepiej jak potrafisz? Zawieszenie nadziei na kontrole w jailbreak nie jest optymalne. - Leo Natan


Oto najlepszy sposób sprawdzenia, czy urządzenie jailbroken

Kod, który sprawdza

bool forked = fork ();
if (forked) {
    // Urządzenie jest jailbreak
}

0
2018-03-15 14:43





Sprawdź ten link Przedmioty z pęku kluczy, w którym można wyliczyć wszystkie przedmioty z pęku kluczy.

Możesz także użyć Atrybuty ochrony do zabezpieczania informacji.

Apple Docs

Dobry odczyt


0
2018-03-17 12:38