SQLCIPHER sqlite 加密的 iphone ios 将未加密的数据库转换为加密的数据库
Posted
技术标签:
【中文标题】SQLCIPHER sqlite 加密的 iphone ios 将未加密的数据库转换为加密的数据库【英文标题】:SQLCIPHER sqlite encrypted iphone ios converting un-encrypted database to encrypted database 【发布时间】: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)。重新生成密钥功能无济于事...您找到解决方案了吗?
【参考方案1】:
之前关于这个问题的所有 cmets 都是不正确的。 您不能使用 rekey 来加密明文数据库。 Rekey 仅用于更改加密数据库上的加密密钥。
加密明文数据库的正确方法是附加和导出 - 请参阅此处的示例http://sqlcipher.net/sqlcipher-api/#sqlcipher_export
【讨论】:
好吧,现在我已经完成了这个,并且数据库可以使用 attache 很好地加密,但只有一次。当我尝试使用相同的密码再次打开数据库时,它说它已加密并且不会打开。 你关闭了原来的数据库,重新打开了新的加密数据库,然后重新设置了密钥吗?【参考方案2】:诀窍是,当数据库用于检查加密(下次打开应用程序)时,它已经加密,但不使用密钥进行选择,这将失败,但随后数据库将不得不用钥匙关闭并重新打开。
【讨论】:
以上是关于SQLCIPHER sqlite 加密的 iphone ios 将未加密的数据库转换为加密的数据库的主要内容,如果未能解决你的问题,请参考以下文章