2016-10-26 10 views
0

私はiOSアプリケーションで作業しています。 Encryption & Decryption &書き込みはiOS 9まで行われていました。しかし、iOS 10にアップグレードした後、"ファイルが暗号化されているかデータベースではない"というメッセージが表示され始めました。iOS 10で暗号化されたDBが正しく動作しない

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

**パスワードを暗号化しない**、攻撃者がDBを取得したときにも暗号化キーを取得します。約100msの間、ランダムな塩でHMACを繰り返し、塩をハッシュで保存します。 password_hash、PBKDF2、Bcryptなどの関数を使用します。要点は、攻撃者が無差別にパスワードを見つけるのに多くの時間を費やすことです。 – zaph

答えて

0

データベースを開くたびにPRAGMA key =を実行するか、sqlite3_keyを使用する必要があります。実際には、アプリケーションの開始時にデータベースを一度開いてから、最後にデータベースを閉じるのが最善です。キーの導出のためにデータベースを繰り返し開いたり閉じたりするのは非常に高価です。

+0

ありがとう私はそれをしました。毎回DBをオープンしようとすると、それは本当です。しかし、複数の並列読み書き操作を実行する必要がある場合はどうなりますか? – CoDe

+1

同時操作を実行する必要がある場合は、おそらく複数の接続を開き、それらの接続を介して要求をシリアル化する必要があります。 SQLiteのようなSQLCipherは同時書き込みを許可しないことに注意してください。書き込みでインタリーブされた同時読み込みをたくさん行う場合は、WALジャーナルモードを使用することができます。 –

関連する問題