Расшифруйте базу данных, используя 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 или я использую его неправильно?

setkey() вернуть YES

executeQuery () возвращает NO из-за ошибки дешифрования

1 ответ

Решение

Призыв к setKey(…) не проверяет, что предоставленный пароль действителен для текущей базы данных, скорее он просто заставляет базу данных присоединять контекст кодека в SQLCipher. Следующая команда SQL, которую вы вводите после ввода ключа базы данных, вызовет деривацию ключа (если вы не используете необработанный шестнадцатеричный ключ) и, как правило, проверяет, может ли SQLCipher использовать ключ для доступа к вашей базе данных. Как правило, мы рекомендуем вам попытаться выполнить следующий запрос, чтобы подтвердить, что пароль действителен как sqlite_master Таблица всегда будет присутствовать, независимо от вашей схемы.

SELECT count(*) FROM sqlite_master;
Другие вопросы по тегам