sqlite шифрование / дешифрование + sqlcipher + iPhone - PullRequest
0 голосов
/ 10 сентября 2010

Я пытался зашифровать / расшифровать базу данных sqlite в своем проекте iPhone. Я могу зашифровать базу данных с помощью метода reKey. Но я не могу расшифровать это. Я сохранил свой файл sqlite.db в папке. В настоящее время пробую это на симуляторе.

Фрагмент кода:

[[SQLiteDB sharedSQLiteDB] open:<path to the folder> withKey:@""];

[[SQLiteDB sharedSQLiteDB] reKey:@"abc"];

[[SQLiteDB sharedSQLiteDB] close];

[[SQLiteDB sharedSQLiteDB] open:<path to the folder> withKey:@"abc"];

[[SQLiteDB sharedSQLiteDB] reKey:@""];

.....

- (BOOL)open:(NSString *)path withKey:(NSString *)masterKey {

    if (sqlite3_open([path fileSystemRepresentation], &_db) != SQLITE_OK) {
        NSLog(@"SQLite Opening Error: %s", sqlite3_errmsg(_db));
        return NO;
    }

    if(masterKey)
        sqlite3_exec(_db, [[NSString stringWithFormat:@"PRAGMA key = '%@'", masterKey] UTF8String], NULL, NULL, NULL);

    if (sqlite3_exec(_db, (const char*) "SELECT count(*) FROM sqlite_master", NULL, NULL, NULL) != SQLITE_OK)
    {
        [self close];
        NSLog(@"SQLite Key Error!");
        return NO;
    }

    filePath = [path retain];
    return YES;
}

......

- (void)reKey:(NSString *)masterKey
{
    sqlite3_exec(_db, [[NSString stringWithFormat:@"PRAGMA rekey = '%@'", masterKey] UTF8String], NULL, NULL, NULL);

}

Я прочитал сообщения на эту тему в группах Google sqlcipher, но не могу расшифровать его. Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 13 сентября 2010

Повторная отправка из списка рассылки:

Если вы пытаетесь взять существующую незашифрованную базу данных, зашифровать ее, а затем расшифровать, наш рекомендуемый подход - не использовать rekey, а вместо этого использоватьБазы данных ATTACHed для копирования данных между стандартной базой данных и базой данных sqlcipher.Здесь есть больше информации и конкретный пример:

http://www.zetetic.net/blog/2009/12/29/how-to-encrypt-a-plaintext-sqlite-database-to-use-sqlcipher/

Если вместо этого вы просто пытаетесь использовать sqlcipher для шифрования данных в целом (т.е. без преобразования из ранее существовавшегобаза данных), то вам просто нужно использовать sqlite3_key.Вы просто открываете базу данных, предоставляете ключ и затем делаете вызовы sql.Нет отдельных этапов шифрования / дешифрования - все это обрабатывается на лету кодом sqlcipher.В коде, который вы разместили ранее, вы никогда не будете вызывать rekey вообще.Каждый раз, когда вы открываете базу данных, вы вызываете ключ PRAGMA, а затем запускаете быструю проверку, чтобы убедиться, что sqlite_master доступен для чтения.

...