2016-10-26 5 views
0

Я работаю над приложением iOS. Encryption & Decryption читать & Запись работала до iOS 9. Но после обновления до iOS 10 он начал выдавать сообщение со следующим сообщением, что «файл зашифрован или не является базой данных».Чтение зашифрованной БД, не работающей для 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]; 
} 

Reading:

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

** Не шифруйте пароли **, когда злоумышленник получает БД, он также получит ключ шифрования. Итерацию над HMAC со случайной солью в течение приблизительно 100 мс и сохранение соли с хешем. Используйте такие функции, как password_hash, PBKDF2, Bcrypt и аналогичные функции. Дело в том, чтобы заставить злоумышленника потратить много времени на поиск паролей грубой силой. – zaph

ответ

0

Вам нужно запустить PRAGMA key = или использовать sqlite3_key после открытия каждой базы данных. Фактически, лучше всего открыть базу данных один раз в начале вашего приложения, а затем закрыть ее в конце. Очень дорого многократно открывать и закрывать базу данных из-за деривации ключа.

+0

Спасибо, я сделал это. О том, чтобы каждый раз открывать БД, это правда. Но как насчет проблемы, если нам нужно выполнить несколько параллельных операций чтения и записи. – CoDe

+1

Если вам нужно выполнить параллельные операции, вам, вероятно, следует открыть несколько подключений, а затем выполнить сериализацию запросов по этим соединениям. Имейте в виду, что SQLCipher (например, SQLite) не допускает одновременную запись. Если вы делаете много параллельных чтений, чередующихся с записью, вам может быть интересно использовать режим журнала WAL. –

 Смежные вопросы

  • Нет связанных вопросов^_^