【发布时间】: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。应该还有一个key或setkey函数。) -
请注意,SQLite 要求数据库处于某种相对“纯”的状态才能重新加密。不应该有任何打开的查询等,并且可能您必须在执行 REKEY 之前关闭并重新打开 - 我忘记了细节。)
-
如果您执行 PRAGMA_REKEY 并且数据库未加密,则您指定了空白/空密钥或未安装 SQLCipher。再一次,我不知道
rekey函数是做什么的。 -
我今天遇到了完全相同的问题(FMDB、sqlcipher、iOS)。重新生成密钥功能无济于事...您找到解决方案了吗?
标签: iphone sqlite encryption sqlcipher