我知道这里有一些帖子,但只是想确保我没有丢失/当前的东西。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,没有错误,但数据库不会被加密。
PRAGMA REKEY是你使用的。那么你当然需要做PRAGMA KEY(* REKEY之后)来设置新的键值。 (我不知道你的fmdb函数是怎么翻译的,推测'rekey'转换为PRAGMA REKEY,还应该有'key'或'setkey'函数。) – 2012-04-11 14:31:51
请注意,SQLite要求DB必须处于某种相对“纯”的状态被重新设定。不应该有任何开放的查询等,并可能是你必须关闭并重新打开之前做REKEY - 我忘了细节。) – 2012-04-11 14:35:09
请参阅编辑。 – ort11 2012-04-11 21:54:03