读取加密数据库不适用于iOS 10

时间:2016-10-26 13:17:39

标签: ios encryption sqlcipher

我正在处理iOS申请。 Encryption& Decryption阅读&写作工作直到iOS 9。但升级到iOS 10后,它开始提出以下消息:“文件已加密或不是数据库”。

对于DB encryption我正在使用以下代码:

sqlite3 *db1;
if (sqlite3_open([[self.databaseURL path] UTF8String], &db1) == SQLITE_OK) {
const char* key = [@"strong" UTF8String];
sqlite3_key(db1, key, (int)strlen(key));

   if (sqlite3_exec(db1, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) {
      NSLog(@"Password is correct, or a new database has been initialized");
   } else {
      NSLog(@"Incorrect password!");
   }
  sqlite3_close(db1);
}

&安培;它工作得很好。

对于打开和阅读操作,我使用以下代码:

-(void)openDB
{
    NSString *docsDir;
    docsDir = [self getDirectoryPath];
    aPath = [docsDir stringByAppendingPathComponent: @"SQLITE_DEMO.sqlite"];
    dbpath = [aPath UTF8String];
}

读:

if (sqlite3_open(dbpath, &contactDBNew) == SQLITE_OK)
        {
            NSString querySQL = [NSString stringWithFormat:@"SELECT  FROM USER"];

            const char *query_stmt = [querySQL UTF8String];
            char *err;

            int check = sqlite3_exec(contactDBNew, query_stmt, NULL, NULL, &err);

            if (sqlite3_prepare_v2(contactDBNew, query_stmt, -1, &statement, NULL) == SQLITE_OK)
            { 
                 // Successfully executed.
         } else {
              // Error in execution.
        }
  }

在阅读预备语句时出现以下错误消息:“文件已加密或不是数据库”。

请建议我缺少什么!!

1 个答案:

答案 0 :(得分:0)

您需要在每个数据库打开后运行PRAGMA key =或使用sqlite3_key。实际上,最好在应用程序启动时打开一次数据库,然后在结束时关闭它。由于密钥推导,重复打开和关闭数据库非常昂贵。