无法使用SQLCipher加密

时间:2010-11-29 16:02:26

标签: iphone objective-c cocoa-touch sqlite sqlcipher

我目前正在开发一款适用于iPhone的简单帐户管理应用。我正在使用sqlcipher来加密和解密数据库。

目前我在应用程序包中有一个未加密的数据库,我希望将其复制到iPhone文档目录然后加密,或者在将其复制到文档目录之前对其进行加密。

我面临的问题是无论我做什么,我似乎得到一个未加密的数据库,无论我尝试使用什么加密方法,无论是“ATTACH”数据库方法还是“密钥”( )/ rekey()“方法。

我尝试在终端中使用“ATTACH”数据库方法,但结果是未加密的数据库。我试着以编程方式使用“key()/ rekey()”方法,如下所示:

 sqlite3 *db;
 NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"KeyCrypt.sqlite"];
 if (sqlite3_open([defaultDBPath UTF8String],&db)==SQLITE_OK) {
  NSLog (@"Running keying.");
  sqlite3_key(db, "1234", 4);
  if (sqlite3_exec(db, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) {
   // password is correct, or, database has been initialized
   NSLog (@"This has occured correctly?");
  } 
  else 
  {
   // incorrect password!
   NSLog (@"This has occured incorrectly?");
  }
 }

我做错了什么,某个地方? 我已经尝试了一整天的在线研究,并且无法找到解决方案,解决为什么我的数据库在运行之前或运行期间没有加密的原因:(

如果您需要我愿意提供给您的任何额外信息,请帮助学生!

谢谢!

编辑:

用于键入我的数据库的方法的摘录。

 //Initializing the sqlite3_key function.
        int sqlite3_key(sqlite3 *db, const void *pKey, int nKey);
        sqlite3_key(db, "1234", 4);

显然我没有初始化sqlite3_key -_-“。 此外,尽管文件已加密,但检查仍然表示发生了错误的数据并且数据库未成功打开。

关于打开数据库,我打开数据库的每个实例都必须运行sqlite3_key吗?在那个例子中,我可以正常访问数据库吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

SQLCipher不再支持使用rekey将未加密的数据库转换为加密数据库,因为更改页面大小和每页初始化向量所需的保留字节会涉及一些复杂性。因此,您提供的代码将无法在任何最新版本的SQLCipher上运行。根据您的要求,有两种选择:

  1. 我们目前向数据库添加加密的指南是使用ATTACH。简而言之,您将加密的数据库附加到标准SQLite数据库,然后在两者之间复制数据。这是一篇描述该方法的帖子:How to encrypt a plaintext SQLite database to use SQLCipher
  2. 不要在应用程序包中分发未加密的数据库,只需在使用已知密钥的数据库中包含数据库的加密副本即可。然后,在启动时,将数据库复制到位,使用已知的默认密钥打开它,然后使用新的每用户密钥数据运行rekey。这将重写数据库以使用您想要的新密钥。