Расшифруйте базу данных, используя FMDB с SQLCipher, setkey с неправильным паролем всегда возвращает YES
Версия FMDB (2.6.2)
Проблема: я тестирую FMDB и SQLCipher и нахожу хитрую проблему. Я успешно шифрую БД с паролем "test001", экспортирую и открываю БД с помощью DB Brower, с "test001" открываю без проблем. Затем в Xcode я пытаюсь открыть БД с паролем 'test002'(я делаю это, чтобы проверить, скажет ли мне FMDB, что я использую неправильный пароль), однако setkey() возвращает YES. Я проверяю db.lastErrorMessage, он возвращает nil, что означает, что FMDB считает, что дал правильный ключ. Затем я пытаюсь прочитать данные из БД с помощью executeQuery(), функция возвращает NO, а файл NSLog показывает, что файл зашифрован или не является база данных ".
У кого-нибудь есть такая же проблема? Это ошибка sqlite или я использую его неправильно?
1 ответ
Призыв к setKey(…)
не проверяет, что предоставленный пароль действителен для текущей базы данных, скорее он просто заставляет базу данных присоединять контекст кодека в SQLCipher. Следующая команда SQL, которую вы вводите после ввода ключа базы данных, вызовет деривацию ключа (если вы не используете необработанный шестнадцатеричный ключ) и, как правило, проверяет, может ли SQLCipher использовать ключ для доступа к вашей базе данных. Как правило, мы рекомендуем вам попытаться выполнить следующий запрос, чтобы подтвердить, что пароль действителен как sqlite_master
Таблица всегда будет присутствовать, независимо от вашей схемы.
SELECT count(*) FROM sqlite_master;