【发布时间】:2010-12-06 04:45:18
【问题描述】:
我在为我的项目加密我的 SQLITE 数据库时遇到了很多问题,最后我尝试使用附加数据库方法来加密我未加密的数据库。
我尝试在终端上运行附加命令,结果却发现输出将是一个未加密的数据库。所以按道理我应该在我的项目中运行命令,导入我的 sqlcipher 和 ssl 库对吗?
所以我试了一下,该方法运行没有任何错误,但我什至没有在文档目录中创建加密数据库。我究竟做错了什么? [下面的代码片段]
- (void)encryptDB
{
NSLog (@"Start");
sqlite3 *DB = [iPad_3AppDelegate getNewDBConnection];
sqlite3_exec(DB, "ATTACH DATABASE KeyCryptENC.db AS encrypted KEY 1234;", NULL, NULL, NULL);
sqlite3_exec(DB, "CREATE TABLE encrypted.Account(A_id,C_ID,Account_Name,Username,Password,Other_Information);", NULL, NULL, NULL);
sqlite3_exec(DB, "CREATE TABLE encrypted.Categories(C_ID,Category);", NULL, NULL, NULL);
sqlite3_exec(DB, "CREATE TABLE encrypted.UserInfo(Password,Hint,Secret_Question,Secret_Answer);", NULL, NULL, NULL);
sqlite3_exec(DB, "INSERT INTO encrypted.Account SELECT * FROM Account;", NULL, NULL, NULL);
sqlite3_exec(DB, "INSERT INTO encrypted.Categories SELECT * FROM Categories;", NULL, NULL, NULL);
sqlite3_exec(DB, "INSERT INTO encrypted.UserInfo SELECT * FROM UserInfo;", NULL, NULL, NULL);
sqlite3_exec(DB, "DETACH DATABASE encrypted;", NULL, NULL, NULL);
NSLog (@"End");
}
+ (sqlite3 *)getNewDBConnection{
sqlite3 *newDBconnection;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"KeyCrypt.sqlite"];
// Open the database. The database was prepared outside the application.
if (sqlite3_open([path UTF8String], &newDBconnection) == SQLITE_OK) {
NSLog(@"Database Successfully Opened :)");
} else {
NSLog(@"Error in opening database :(");
}
return newDBconnection;
}
非常感谢大家的帮助!
【问题讨论】:
-
嗨seelani,您能详细解释一下,您是如何从纯文本sqlite 数据库创建加密数据库的吗?我和你一样被困
-
你知道了吗,抱歉回复晚了,因为我正在享受一周的假期。嗯,这是我用来解决我的问题的链接,github.com/sjlombardo/sqlcipher/issues/closed#issue/1 看看 sjlombardo 的第二条评论。
-
在执行该代码之前是否必须存在 KeyCryptENC.db?是否应该将 KeyCryptENC.db 保存到应用程序的 Documents 目录中?
-
@seelani:上面的链接坏了,我也遇到了同样的问题,你能更正或解释一下吗?
标签: iphone database sqlite sqlcipher