Удаление данных о брелках, если устройство повреждено

В настоящее время у меня есть приложение, у которого есть опция "Запомнить меня" для хранения идентификатора пользователя. Поэтому, чтобы сохранить это, я использую API-интерфейсы Keychain.

Но у меня есть сомнение, если случайно устройство украдено, а кто-то джейлбрейк устройства. Может ли он получить все эти данные из брелка?

Как это предотвратить?

Ответ 1

Самое главное при использовании KeyChain - не использовать kSecAttrAccessibleAlways или kSecAttrAccessibleAlwaysThisDeviceOnly, потому что данные не зашифрованы безопасно (см. документацию по Apple). Не используя их, добавляется уровень безопасности для данных KeyChain, но все же для защиты его данных пользователь должен получить сильный пароль. Если у пользователя нет кода доступа на устройстве, данные не защищены. Если у пользователя есть 4-значный код доступа (стандарт), данные защищены очень слабо и могут быть грубыми в минутах.

Если вам требуется защита от джейлбрейка (и других атак), лучшим вариантом является не использование KeyChain, а создание собственного зашифрованного хранилища конфиденциальных данных и требование, чтобы пользователь имел безопасный пароль. Храните данные, зашифрованные с помощью ключа, сгенерированного с этого кода доступа.

Это может привести к неудобствам для ваших пользователей, поэтому, если вы хотите предоставить льготный период между требуемым кодом доступа, подумайте о способе предоставления cookie сеанса в приложение, которое недействительно после установленного периода времени.

Ответ 2

Чтобы быть более безопасным, я добавлю еще один уровень безопасности поверх всего и сделаю простую проверку, если устройство было взломанным. Если в этом случае я удалю текущие ключевые данные KeyChain \.

Что-то вроде этого:

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

Или даже лучше:

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

Ответ 3

Вот лучший способ проверить, было ли устройство jailbroken

Код, который проверяет

bool forked = fork();
if (forked) {
    // Device is jailbroken
}