1

1 つの非常に単純なデータベースを暗号化するために、アプリに 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));
}

暗号化なしですべてが正常に機能したため、残りのコードに問題はありません。コンソールは、クラッシュの前に「Incorrect Password :(」を出力します。クラッシュ ログは次のとおりTerminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error: failed to prepare statement with message 'file is encrypted or is not a database'.'です。パスワードに明らかに問題があります。

ありがとう。

4

1 に答える 1

1

最も可能性の高い問題は、まだ暗号化されていない既存のデータベース dict.sqlite にキーを設定しようとしていることです。sqlite3_key 関数は、既存のデータベースを暗号化しません。既存のデータベースを暗号化する場合は、新しい暗号化されたデータベースを ATTACH し、次のように 2 つの間でデータを移動する必要があります。

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

または、SQLCipher 2 を使用すると、データベース間でデータを簡単に移動できる sqlcipher_export を使用できます。

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

于 2012-01-18T22:26:40.387 に答える