我知道有一些贴子,但只是想确保有一些我不缺少/最新的。
使用带有未加密数据库的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运行,没有错误,但数据库没有加密。
答案 0 :(得分:4)
之前关于此问题的所有评论均不正确。 您无法使用重定密钥加密明文数据库。重定密钥仅用于更改加密数据库上的加密密钥。
加密纯文本数据库的正确方法是附加和导出 - 请参阅此处的示例http://sqlcipher.net/sqlcipher-api/#sqlcipher_export
答案 1 :(得分:0)
诀窍是,当数据库用于检查加密时(下次打开应用程序),当它已经加密,但不使用密钥进行选择时,这将失败,但数据库将必须关闭并用钥匙重新打开。