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

Posted

技术标签:

【中文标题】SQLCIPHER sqlite 加密的 iphone ios 将未加密的数据库转换为加密的数据库【英文标题】:SQLCIPHER sqlite encrypted iphone ios converting un-encrypted database to encrypted database 【发布时间】:2012-04-11 14:27:24 【问题描述】:

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

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

【问题讨论】:

PRAGMA REKEY 就是您所使用的。然后,您当然需要执行 PRAGMA KEY( REKEY)来设置新的键值。 (我不知道你的 fmdb 函数翻译成什么。大概 rekey 翻译成 PRAGMA REKEY。应该还有一个 keysetkey 函数。) 请注意,SQLite 要求数据库处于某种相对“纯”的状态才能重新加密。不应该有任何打开的查询等,并且可能您必须在执行 REKEY 之前关闭并重新打开 - 我忘记了细节。) 如果您执行 PRAGMA_REKEY 并且数据库未加密,则您指定了空白/空密钥或未安装 SQLCipher。再一次,我不知道rekey 函数是做什么的。 我今天遇到了完全相同的问题(FMDB、sqlcipher、ios)。重新生成密钥功能无济于事...您找到解决方案了吗? 【参考方案1】:

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

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

【讨论】:

好吧,现在我已经完成了这个,并且数据库可以使用 attache 很好地加密,但只有一次。当我尝试使用相同的密码再次打开数据库时,它说它已加密并且不会打开。 你关闭了原来的数据库,重新打开了新的加密数据库,然后重新设置了密钥吗?【参考方案2】:

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

【讨论】:

以上是关于SQLCIPHER sqlite 加密的 iphone ios 将未加密的数据库转换为加密的数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中使用“FMDB/SQLCipher”进行加密和解密?

iOS 设备上的 SQLCipher + DB 性能较差

SQLCipher加密数据库打开工具

SQLCipher加密数据库打开工具

Android 使用 sqlcipher 加密数据库

SQLCipher、encrypted-core-data 和 iOS - 两个 .sqlite 文件正常吗?