0

我知道有一些关于此的帖子,但只是想确保有一些我没有丢失/当前的东西。

使用 sqlcipher,带有未加密的数据库,想对其进行加密。加密新数据库工作正常。

我正在尝试使用现有数据库的 sqlcipher rekey 似乎不起作用(数据库保持未加密)。

       [fmdb open];
       NSString *sel = @"SELECT count(*) FROM sqlite_master";            
       FMResultSet *fmr = [self executeQuery : fmdb : sel];

        if ( [fmr next] ) // unencrypted
        {
            NSLog(@"Encrypting");
            fmdb.key = @"";
            [fmdb rekey : @"somekey"];
        }

否则将不得不使用其他 PRAGMA 方法之一,等等。

重新生成密钥是否仅适用于已加密的数据库?

这是使用 FMDatabase 框架,但在框架的底层它正在做......

    - (BOOL)rekey:(NSString*)key {
    #ifdef SQLITE_HAS_CODEC
    if (!key) {
        return NO;
    }

    int rc = sqlite3_rekey(db, [key UTF8String], (int)strlen([key UTF8String]));

    if (rc != SQLITE_OK) {
        NSLog(@"error on rekey: %d", rc);
        NSLog(@"%@", [self lastErrorMessage]);
    }

    return (rc == SQLITE_OK);
    #else
        return NO;
    #endif
   }

它通过 sqlite3_rekey 运行,没有错误,但数据库没有被加密。

4

2 回答 2

4

之前关于这个问题的所有评论都是不正确的。您不能使用 rekey 来加密明文数据库。Rekey 仅用于更改加密数据库上的加密密钥。

加密明文数据库的正确方法是附加和导出 - 请参阅此处的示例http://sqlcipher.net/sqlcipher-api/#sqlcipher_export

于 2012-04-12T12:20:34.453 回答
0

诀窍是,当数据库用于检查加密(下次打开应用程序)时,它已经加密,但不使用密钥进行选择,这将失败,但随后数据库将不得不关闭并且再次用钥匙重新打开。

于 2012-04-16T15:36:19.093 回答