2016-10-26 3 views
0

iOS 응용 프로그램에서 작업하고 있습니다. Encryption & Decryption & 쓰기가 iOS 9까지 작동하고있었습니다. 그러나 iOS 10으로 업그레이드 한 후 "파일이 암호화되었거나 데이터베이스가 아닙니다"라는 메시지와 함께 문제가 발생하기 시작했습니다.암호화 된 DB 읽기가 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

** ** 암호를 암호화하지 마십시오. ** 공격자가 DB를 받으면 암호화 키도 받게됩니다. 약 100ms 동안 무작위 소금으로 HMAC를 반복하고 소금을 해시로 저장하십시오. password_hash, PBKDF2, Bcrypt 및 유사한 기능과 같은 기능을 사용하십시오. 요점은 공격자가 무차별 적으로 암호를 찾는 데 많은 시간을 소비하게하는 것입니다. – zaph

답변

0

PRAGMA key =를 실행하거나 모든 데이터베이스가 열린 후에 sqlite3_key를 사용해야합니다. 사실 응용 프로그램을 시작할 때 한 번 데이터베이스를 연 다음 마지막 단계에서 데이터베이스를 닫는 것이 가장 좋습니다. 키 유도로 인해 데이터베이스를 반복적으로 열고 닫는 것은 매우 비쌉니다.

+0

감사합니다. 매번 DB를 열 때, 사실입니다.하지만 여러 개의 병렬 읽기 및 쓰기 작업을 수행해야하는 경우에는 어떤 문제가 발생합니까? – CoDe

+1

동시 작업을 수행해야하는 경우에는 여러 연결을 연 다음 해당 연결을 통해 요청을 직렬화해야합니다. SQLite와 같은 SQLCipher는 동시 쓰기를 허용하지 않습니다. 쓰기로 인터리브 된 동시 읽기를 많이 수행하는 경우 WAL 저널 모드를 사용하는 것이 좋습니다. –

관련 문제