2012-04-11 145 views
0

我知道这里有一些帖子,但只是想确保我没有丢失/当前的东西。SQLCIPHER sqlite加密iphone ios将未加密的数据库转换为加密数据库

使用带有未加密数据库的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方法之一,等等

是否REKEY只与已经加密的数据库工作?

这是使用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,没有错误,但数据库不会被加密。

+0

PRAGMA REKEY是你使用的。那么你当然需要做PRAGMA KEY(* REKEY之后)来设置新的键值。 (我不知道你的fmdb函数是怎么翻译的,推测'rekey'转换为PRAGMA REKEY,还应该有'key'或'setkey'函数。) – 2012-04-11 14:31:51

+0

请注意,SQLite要求DB必须处于某种相对“纯”的状态被重新设定。不应该有任何开放的查询等,并可能是你必须关闭并重新打开之前做REKEY - 我忘了细节。) – 2012-04-11 14:35:09

+0

请参阅编辑。 – ort11 2012-04-11 21:54:03

回答

0

诀窍是,当数据库被用来检查加密(下一次打开应用程序),当它已经被加密,但不要使用一个键来做选择,这将失败,但是随后数据库将被关闭并且再次用该键重新打开。

3

对此问题的所有以前的评论是不正确的。 您不能使用重新密钥来加密明文数据库。重置密钥仅用于更改加密数据库上的加密密钥。

加密明文数据库的正确方法是重视和出口 - 见的例子在这里http://sqlcipher.net/sqlcipher-api/#sqlcipher_export

+0

好吧,现在我已经完成了这个工作,数据库的加密很好,但只有一次。当我尝试用相同的密码再次打开数据库时,它说它已加密并且不会打开。 – ort11 2012-04-12 21:43:38

+0

是否关闭了原始数据库,重新打开新的加密数据库并再次设置密钥? – 2012-04-16 14:18:57