3

新しい暗号化されたデータベースの作成に問題があります。私はこれについて調査を行いましたが、これらは私が試したいくつかの解決策です。

http://sqlcipher.net/design/に基づく端末の使用

sqlite3 sqlcipher.db
sqlite> PRAGMA KEY='test123';
sqlite> CREATE TABLE t1(a,b);
sqlite> INSERT INTO t1(a,b) VALUES ('one for the money', 'two for the show');
sqlite> .quit

~ $ hexdump -C sqlcipher.db

hexdump を実行しても、暗号化されていないデータベース テキストが表示されます。

ios で既存の Db にアタッチされた方法を実行します。

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

    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 'encrypted.db' 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));
    }
}

上記の実行に問題はありませんが、encrypted.db がドキュメント フォルダーに表示されません。

アプリケーションでsslとsqlcipherを設定した後。これを使って

- (void) openCipherDB
{
    NSString *databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] 
                              stringByAppendingPathComponent: @"unencrypted.db"];
    NSLog(@"database path %@", databasePath);
    sqlite3 *db;
    if (sqlite3_open([databasePath UTF8String], &db) == SQLITE_OK)
    {
        //sqlite3_exec(_db, "ATTACH DATABASE 'xyz.sqlite' AS encrypted KEY 'test';", NULL, NULL, &t)
        const char* key = [@"secret" UTF8String];
        int sqlite3_key(sqlite3 *db, const void *pKey, int nKey);       //i added this after seeing SO
        sqlite3_key(db, key, strlen(key));
        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(@"database initialize");
        } 
        else 
        {
            NSLog(@"incorrect pass");
            // incorrect password!
        }

        sqlite3_close(db);
    }
}

それは私に間違ったパスワードの NSLog を与え、もちろん私のデータベースも暗号化されていません。

データベースを暗号化するために他に何ができますか? ありがとう。

4

2 に答える 2

4

あなたが抱えている最初の問題は、./sqlite3の代わりにsqlite3を実行することです。sqlite3のsqlcipherバージョンへの明示的なパスを指定する必要があります。そうしないと、暗号化をサポートしていないOSの一部としてインストールされたパスを使用することになります。

2番目の問題では、stringByAppendingPathComponentを使用して、添付ファイルでencrypted.dbへのフルパスを指定する必要があります(たとえば、unencrypted.dbのフルパスを作成するのと同じ方法)。

于 2012-11-19T14:34:14.703 に答える