Mam pytanie dotyczące szyfrowania danych podstawowych. Przechowuję poufne dane użytkownika w bazie danych SQLite Core Data. Wartości krytyczne są wszystkie transformables i używam AES256 do szyfrowania i odszyfrowywania ich "w locie", w tym indywidualnych IV dla każdej wartości. Klucz szyfrowania to skrót SHA512 hasła wybranego przez użytkownika. Działa to bardzo dobrze do tej pory.Core Data Encryption
Teraz hasło użytkownika. Gdy użytkownik uruchamia aplikację, jest proszony o podanie swojego hasła. Hasło jest mieszane za pomocą SHA512 i przechowywane w pęku kluczy systemu iOS. Dla każdej operacji zapisu lub odczytu NSValueTransformer otrzyma hasło z pęku kluczy. Jeśli aplikacja jest zamykana, usuwam hash hasła z pęku kluczy.
W mojej bazie danych podstawowych mam specjalną jednostkę, która ma losową liczbę! = 0, ponieważ jest to tylko wartość. Aby sprawdzić, czy użytkownik wprowadził poprawne hasło, pobieram ten element i odczytuję numer. Jeśli jest =! 0, Wiem, że hasło było poprawne, ponieważ gdy odszyfrowanie się nie powiedzie, NSValueTransformer zawsze zwraca 0.
Teraz moje aktualne pytania: Czy uważasz, że to dobre podejście do szyfrowania? Jak inaczej można sprawdzić, czy wprowadzone hasło jest poprawne?
Jestem trochę zaniepokojony, że przechowywanie skrótu hasła w pęku kluczy podczas działania aplikacji sprawia, że wszystko wolniej, ponieważ NSValueTransformer musi przez cały czas mieć dostęp do pęku kluczy. Czy byłoby wystarczająco bezpieczne, aby zachować hasło w pamięci, więc zostanie ono usunięte po zamknięciu aplikacji?
Czy możesz wyjaśnić, co masz na myśli mówiąc "użyj losowo wygenerowanego klucza szyfrowania, który zaszyfrujesz kluczem szyfrowania opartym na haśle?" Próbuję również zaszyfrować niektóre pola mojego podstawowego magazynu danych i szukam najlepszej praktyki do generowania klucza do użycia do szyfrowania. Zgadzam się, że oparcie go na haśle nie ma sensu, ponieważ może się zmienić. –