SQLCIPHER sqlite加密iphone ios将未加密的数据库转换为加密数据库

时间:2012-04-11 14:27:25

标签: iphone sqlite encryption sqlcipher

我知道有一些贴子,但只是想确保有一些我不缺少/最新的。

使用带有未加密数据库的sqlcipher,要加密它。加密新数据库工作正常。

尝试使用现有数据库的sqlcipher重定密钥似乎无法正常工作(数据库保持未加密状态)。

       [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运行,没有错误,但数据库没有加密。

2 个答案:

答案 0 :(得分:4)

之前关于此问题的所有评论均不正确。 您无法使用重定密钥加密明文数据库。重定密钥仅用于更改加密数据库上的加密密钥。

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

答案 1 :(得分:0)

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