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

SQLCIPHER sqlite加密的iphone ios将未加密的数据库转换为加密的数据库,iphone,sqlite,encryption,sqlcipher,Iphone,Sqlite,Encryption,Sqlcipher,我知道这上面有一些帖子,但我只是想确保我没有遗漏/最新的东西 使用sqlcipher,对于未加密的数据库,您希望对其进行加密。加密一个新数据库工作正常 我正在使用现有数据库尝试sqlcipher密钥更新,但似乎无法工作(数据库仍然未加密) 否则将不得不使用其他PRAGMA方法之一,等等 重新密钥是否仅适用于已加密的数据库 这是使用FMDatabase框架,但在框架的引擎盖下它正在做 - (BOOL)rekey:(NSString*)key { #ifdef SQLITE_HAS_

我知道这上面有一些帖子,但我只是想确保我没有遗漏/最新的东西

使用sqlcipher,对于未加密的数据库,您希望对其进行加密。加密一个新数据库工作正常

我正在使用现有数据库尝试sqlcipher密钥更新,但似乎无法工作(数据库仍然未加密)

否则将不得不使用其他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加密明文数据库。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"];
        }

加密明文数据库的正确方法是附加和导出-请参见此处的示例

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


加密明文数据库的正确方法是附加和导出-参见此处的示例

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

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

您使用的是PRAGMA-REKEY。当然,然后需要执行PRAGMA KEY(在重新设置键之后)来设置新的键值。(我不知道你的fmdb函数翻译成什么。大概
rekey
翻译成PRAGMA rekey。也应该有
key
setkey
函数。)请注意,SQLite要求DB处于某种相对“纯”的状态才能重新设置密钥。不应该有任何打开的查询等,可能是在执行重新设置密钥之前必须关闭并重新打开(我忘记了细节。)如果执行PRAGMA_重新设置密钥,并且数据库没有加密,则可能是指定了空/空密钥,或者没有安装SQLCipher。再一次,我不知道
rekey
函数做了什么。我今天遇到了完全相同的问题(FMDB、sqlcipher、iOS)。重新设置密钥功能不起任何作用。。。你找到解决办法了吗?你用的是PRAGMA-REKEY。当然,然后需要执行PRAGMA KEY(在重新设置键之后)来设置新的键值。(我不知道你的fmdb函数翻译成什么。大概
rekey
翻译成PRAGMA rekey。也应该有
key
setkey
函数。)请注意,SQLite要求DB处于某种相对“纯”的状态才能重新设置密钥。不应该有任何打开的查询等,可能是在执行重新设置密钥之前必须关闭并重新打开(我忘记了细节。)如果执行PRAGMA_重新设置密钥,并且数据库没有加密,则可能是指定了空/空密钥,或者没有安装SQLCipher。再一次,我不知道
rekey
函数做了什么。我今天遇到了完全相同的问题(FMDB、sqlcipher、iOS)。重新设置密钥功能不起任何作用。。。你找到解决方案了吗?好吧,现在我已经这样做了,数据库可以通过附件进行加密,但只加密一次。当我尝试用相同的密码再次打开数据库时,它会说数据库已加密,不会打开。您是否关闭了原始数据库,重新打开了新的加密数据库,然后再次设置了密钥?好的,现在我已经这样做了,数据库与附件加密良好,但只加密了一次。当我尝试使用相同的密码再次打开数据库时,它会显示该数据库已加密且不会打开。您是否关闭了原始数据库,重新打开了新的加密数据库,然后再次设置了密钥?