我在我的应用程序中使用SQLCipher来加密sqlite数据库。但是我的应用程序在获取数据库时运行缓慢。我将 PRAGMA kdf_iter 更改为4000并且它仍然很慢。我没有任何问题。
-(NSError *) openDatabase {
NSError *error = nil;
NSString *databasePath = [self getDatabasePath];
const char *dbpath = [databasePath UTF8String];
int result = sqlite3_open_v2 (dbpath, &db , SQLITE_OPEN_READWRITE , NULL);
if (result == SQLITE_OK) {
sqlite3_exec(db, [@"PRAGMA kdf_iter = '4000';" UTF8String], NULL, NULL, NULL);
sqlite3_exec(db, [@"PRAGMA key = 'password'" UTF8String], NULL, NULL, NULL);
NSLog(@"Password is correct , Database is Activated");
sqlite3_exec(db, [@"PRAGMA cipher = 'aes-256-cfb';" UTF8String], NULL, NULL, NULL);
}
else {
NSLog(@"Incorrect password!");
}
if (result != SQLITE_OK) {
const char *errorMsg = sqlite3_errmsg(db);
NSString *errorStr = [NSString stringWithFormat:@"The database could not be opened: %@",[NSString stringWithCString:errorMsg encoding:NSUTF8StringEncoding]];
error = [self createDBErrorWithDescription:errorStr andCode:kDBFailAtOpen];
}
return error;
}
答案 0 :(得分:2)
最后,我可以使用Nick Parker有用的指导优化我的 SQLCipher性能。
正如他所说:
最佳SQLCipher性能有一些非常重要的指导原则:
要诊断特定查询语句的性能问题,针对特定查询运行 explain query plan 命令可能会有所帮助。
如果您不确定哪些查询性能不佳,SQLCipher包含一个名为 cipher_profile 的编译指示,它允许以毫秒为单位分析查询及其各自的执行时间。
非常感谢Nick Parker。
此blog对我来说非常有用。
答案 1 :(得分:0)
为什么使用CFB模式(aes-256-cfb)而不是CBC?
我认为硬件加密不支持AES CFB,所以它可能会使用软件加密,速度可能会慢500倍。
来自文档:
SQLCipher使用aes-256-cbc作为默认密码和操作模式。虽然通常不推荐,但可以改变这种情况