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 版本的显式路径,否则您最终将使用作为操作系统一部分安装的路径,它不支持加密。

对于第二个问题,您必须使用 stringByAppendingPathComponent 在附件中提供 encrypted.db 的完整路径(例如,与创建 unencrypted.db 的完整路径相同的方式)。

于 2012-11-19T14:34:14.703 回答
0

我也面临附加数据库的第二个问题。我对如何使用 Stephen 提供的解决方案感到困惑,因为我无法弄清楚如何将完整路径提供给 sql 语句,因为它只接受const char,最后我想出了下面的代码并且它工作,发布相同这里

.....................

NSString *sql1 = [NSString stringWithFormat:@"ATTACH DATABASE '%s' AS encrypted KEY '%s'",[encryptedDBPath UTF8String],"1234" ];
NSLog(@"String is %@", sql1);
sqlite3_exec(unencrypted_DB, [sql1 UTF8String], NULL, NULL, NULL);

.....................................

-anoop

于 2014-08-06T10:55:46.817 回答