SQLCipher работает, но неверный пароль - PullRequest
1 голос
/ 19 января 2012

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

NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] 
                      stringByAppendingPathComponent: @"dict.sqlite"];
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
        const char* key = [@"BIGSecret" UTF8String];
        sqlite3_key(database, key, strlen(key));
        if (sqlite3_exec(database, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) {
            // password is correct, or, database has been initialized
            NSLog(@"Correct Password :)");
        } 
        else {
            // incorrect password!
            NSLog(@"Incorrect Password :(");
        }
    }
    else {
        sqlite3_close(database);
        NSAssert1(NO, @"Failed to open database with message '%s'.", sqlite3_errmsg(database));
    }
}

sqlite3 *database; объявлено в моем интерфейсе. Мое приложение падает на этой линии:

if (sqlite3_prepare_v2(database, sql, -1, &init_statement, NULL) != SQLITE_OK) {
    NSAssert1(NO, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
}

Все отлично работало без шифрования, поэтому с остальным моим кодом проблем нет. Консоль печатает «Неверный пароль :(» до сбоя. Журнал сбоя: Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error: failed to prepare statement with message 'file is encrypted or is not a database'.' Очевидно, что с паролем есть проблема. Любая помощь?

Спасибо.

1 Ответ

1 голос
/ 19 января 2012

Наиболее вероятная проблема заключается в том, что вы пытаетесь установить ключ в существующей базе данных, которая еще не зашифрована, dict.sqlite.Функция sqlite3_key не шифрует существующую базу данных.Если вы хотите зашифровать существующую базу данных, вам нужно либо присоединить новую зашифрованную базу данных и переместить данные между ними, как описано здесь:

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

Или, используя SQLCipher2 вы можете использовать sqlcipher_export, который обеспечивает простой способ перемещения данных между базами данных.:

http://groups.google.com/group/sqlcipher/msg/76d5b03426419761

...