Присоединение зашифрованной базы данных к незашифрованной базе данных с помощью SQLCipher - PullRequest
5 голосов
/ 19 января 2012

Я пытаюсь добавить содержимое незашифрованной базы данных sqlite3 в зашифрованную, используя SQLCipher. Я основал то, что я пытаюсь сделать на этом и этом . Однако некоторые вещи остаются неясными для меня.

  1. В строке ATTACH DATABASE должна ли зашифрованная база данных иметь тип .db? Может ли .sqlite соответствовать моей исходной базе данных?

  2. Должна ли указанная зашифрованная база данных уже существовать? Если так, где это должно быть в приложении? Нужно ли указывать путь к файлу (каталог документов и т. Д.)?

  3. Где я могу найти успешно зашифрованную базу данных? Где это будет сохранено?

Вот мой код:

+ (void)encryptDB
{
    sqlite3 *unencrypted_DB;
    NSString *path_u = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] 
                  stringByAppendingPathComponent:@"dict.sqlite"];

    if (sqlite3_open([path_u UTF8String], &unencrypted_DB) == SQLITE_OK) {
        NSLog(@"Database Opened");
        // Attach empty encrypted database to unencrypted database
        sqlite3_exec(unencrypted_DB, "ATTACH DATABASE 'dict_encrypted.sqlite' AS encrypted KEY '1234';", NULL, NULL, NULL);

        // Create new tables within encrypted database to match those in unencrypted database
        sqlite3_exec(unencrypted_DB, "CREATE TABLE encrypted.t1(A,B,C);", NULL, NULL, NULL);

        // Copy items from unencrypted database into encrypted database
        sqlite3_exec(unencrypted_DB, "INSERT INTO encrypted.t1 SELECT * FROM t1;", NULL, NULL, NULL);

        // Detach encrypted database
        sqlite3_exec(unencrypted_DB, "DETACH DATABASE encrypted;", NULL, NULL, NULL);

        NSLog (@"End database copying");
        sqlite3_close(unencrypted_DB);
    }
    else {
        sqlite3_close(unencrypted_DB);
        NSAssert1(NO, @"Failed to open database with message '%s'.", sqlite3_errmsg(unencrypted_DB));
    }
}

Ответы [ 3 ]

6 голосов
/ 03 апреля 2012

В последней версии SQLCipher у нас есть функция sqlcipher_export (), которая может сделать наш код короче и не подключаться к существующей структуре базы данных:

+ (void)encryptDB
{
    sqlite3 *unencrypted_DB;
    NSString *path_u = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] 
                         stringByAppendingPathComponent:@"dict.sqlite"];

    if (sqlite3_open([path_u UTF8String], &unencrypted_DB) == SQLITE_OK) {
        NSLog(@"Database Opened");
        // Attach empty encrypted database to unencrypted database
        sqlite3_exec(unencrypted_DB, "ATTACH DATABASE 'dict_encrypted.sqlite' AS encrypted KEY '1234';", NULL, NULL, NULL);

        // export database
        sqlite3_exec(unencrypted_DB, "SELECT sqlcipher_export('encrypted');", NULL, NULL, NULL);

        // Detach encrypted database
        sqlite3_exec(unencrypted_DB, "DETACH DATABASE encrypted;", NULL, NULL, NULL);

        NSLog (@"End database copying");
      sqlite3_close(unencrypted_DB);
    }
    else {
        sqlite3_close(unencrypted_DB);
        NSAssert1(NO, @"Failed to open database with message '%s'.", sqlite3_errmsg(unencrypted_DB));
    }
}
5 голосов
/ 20 января 2012
  1. Должна ли зашифрованная база данных иметь тип .db?- Нет, вы можете использовать любое расширение по вашему желанию.
  2. Должна ли указанная зашифрованная база данных уже существовать?- Нет, база данных уже не должна существовать.Когда вы присоединяете несуществующую базу данных, она создает новую
  3. Нужно ли указывать путь к файлу (каталог документов и т. Д.)? - Да, вы делаетенеобходимо указать путь к базе данных, в противном случае будет использоваться текущий рабочий каталог приложения.В iOS вы обычно должны указывать полный путь к имени файла, включая каталог документов приложения.
  4. Где я могу найти успешно зашифрованную базу данных? - Зашифрованная база данных будет расположена там, где вы говоритеприкрепить, чтобы положить его.Согласно # 3, если вы создаете для iOS, укажите полный путь к каталогу документа в имени файла, и тогда там будет находиться зашифрованная база данных.
0 голосов
/ 20 января 2012

Ну, я никогда не делал ATTACH DATABASE, и версия SQLCiper, которую я использовал, вероятно, отличается от вашей, но (для реализаций SQLCipher, с которыми я имел дело), ​​логика открытия файлов является стандартным SQLite и ведет себя так же, как и без SQLCipher.

Так что вам не нужен суффикс .db или что-то еще конкретное - вы можете использовать все, что захотите.

Пока вы не введете REKEY, любая новая база данных будет совершенно "нормальной" и будет создавать / удалять "обычным" способом для SQLite.

Re ATTACH DATABASE, я подозреваю, что было бы лучше сначала создать БД (и REKEY она), а затем присоединить ее.

...