0

我目前正在为 iPhone 开发一个简单的帐户管理应用程序。我正在使用 sqlcipher 加密和解密数据库。

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

我面临的问题是,无论我做什么,我似乎都得到了一个未加密的数据库,无论我尝试使用哪种加密方法,无论是“ATTACH”数据库方法还是“key()/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 对吗?在那个实例中,我可以正常访问数据库吗?

谢谢大家的帮助。

4

1 回答 1

3

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

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