Невозможно зашифровать с помощью SQLCipher - PullRequest
0 голосов
/ 29 ноября 2010

В настоящее время я работаю над простым приложением для управления учетными записями для iPhone.Я использую sqlcipher для шифрования и дешифрования базы данных.

В настоящее время у меня есть незашифрованная база данных в комплекте приложений, которую я хочу скопировать в каталог документов iPhone и затем зашифровать или зашифровать.прежде чем я скопирую его в каталог документов.

Проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, что я делаю, мне кажется, что я получаю незашифрованную базу данных, независимо от того, какой метод шифрования я пытаюсь использовать,будь то метод базы данных «ATTACH» или метод «key () / rekey ()».

Я попытался использовать метод базы данных «ATTACH» в терминале, но в результате получилась незашифрованная база данных.Я попытался использовать метод "key () / rekey ()" программно, как показано здесь:

 sqlite3 *db;
 NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"KeyCrypt.sqlite"];
 if (sqlite3_open([defaultDBPath UTF8String],&db)==SQLITE_OK) {
  NSLog (@"Running keying.");
  sqlite3_key(db, "1234", 4);
  if (sqlite3_exec(db, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) {
   // password is correct, or, database has been initialized
   NSLog (@"This has occured correctly?");
  } 
  else 
  {
   // incorrect password!
   NSLog (@"This has occured incorrectly?");
  }
 }

Я что-то делаю не так, где-то?Я пытался исследовать онлайн целый день и не смог найти решение, почему моя база данных не зашифрована до или во время выполнения: (

Если вам требуется дополнительная информация, я хочупредоставьте это вам, пожалуйста, помогите студенту!

СПАСИБО!

РЕДАКТИРОВАТЬ:

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

 //Initializing the sqlite3_key function.
        int sqlite3_key(sqlite3 *db, const void *pKey, int nKey);
        sqlite3_key(db, "1234", 4);

Очевидно, я не инициализировал sqlite3_key -_- ". Также, несмотря на то, что файл зашифрован, проверка все еще говорит, что что-то произошло неправильно, и база данных не была успешно открыта.

Относительно открытия баз данных, каждый экземпляря открываю свою базу данных, мне нужно запустить sqlite3_key, верно? И во время этого экземпляра я могу получить доступ к базе данных в соответствии с обычным правом?

Спасибо за помощь.

1 Ответ

3 голосов
/ 30 ноября 2010

Использование rekey для преобразования незашифрованной базы данных в зашифрованную базу данных больше не поддерживается SQLCipher из-за нескольких сложностей, связанных с изменением размера страницы и зарезервированных байтов, необходимых для векторов инициализации на странице.Таким образом, предоставленный вами код не будет работать с любой последней версией SQLCipher.В зависимости от того, что вы хотите сделать, есть два варианта:

  1. Наше текущее руководство по добавлению шифрования в базу данных - использовать ATTACH.Короче говоря, вы присоединяете зашифрованную базу данных к вашей стандартной базе данных SQLite, а затем копируете данные между ними.Вот пост, описывающий подход: Как зашифровать незашифрованную базу данных SQLite для использования SQLCipher
  2. Вместо того, чтобы распространять незашифрованную базу данных в комплекте приложений, просто включите зашифрованную копию базы данных.в том, что использует известный ключ.Затем, при запуске, скопируйте базу данных на место, откройте ее с известным ключом по умолчанию и запустите rekey с новыми данными ключа для каждого пользователя.Это перезапишет базу данных, чтобы использовать новый ключ, как вы хотели.
...