2012-04-11 2 views
0

나는 이것에 대해 약간의 글이 있음을 알고 있지만, 내가 누락/현재하고 있지 않은 것이 있는지 확인하고자합니다.SQLCIPHER sqlite 암호화 된 암호화되지 않은 데이터베이스를 암호화 된 데이터베이스로 변환

암호화되지 않은 데이터베이스와 함께 sqlcipher를 사용하여 암호화하려고합니다. 새 데이터베이스 암호화가 올바르게 작동합니다.

기존 데이터베이스와 함께 sqlcipher 키를 다시 시도하면 데이터베이스가 암호화되지 않은 상태로 유지됩니다.

 [fmdb open]; 
     NSString *sel = @"SELECT count(*) FROM sqlite_master";    
     FMResultSet *fmr = [self executeQuery : fmdb : sel]; 

     if ([fmr next]) // unencrypted 
     { 
      NSLog(@"Encrypting"); 
      fmdb.key = @""; 
      [fmdb rekey : @"somekey"]; 
     } 

그렇지 않으면 다른 PRAGMA 방법 중 하나를 사용하는 것 등

에만 이미 암호화 된 데이터베이스 작업을 다시 입력합니까?

은 FMDatabase 프레임 워크를 사용하고 있지만, 그것은 sqlite3_rekey, 오류없이하지만 실행 않습니다

- (BOOL)rekey:(NSString*)key { 
    #ifdef SQLITE_HAS_CODEC 
    if (!key) { 
     return NO; 
    } 

    int rc = sqlite3_rekey(db, [key UTF8String], (int)strlen([key UTF8String])); 

    if (rc != SQLITE_OK) { 
     NSLog(@"error on rekey: %d", rc); 
     NSLog(@"%@", [self lastErrorMessage]); 
    } 

    return (rc == SQLITE_OK); 
    #else 
     return NO; 
    #endif 
    } 

프레임 워크의 후드가 ...하고 있지만 데이터베이스가 암호화되지 않습니다.

+0

PRAGMA REKEY는 귀하가 사용하는 것입니다. 물론 새로운 키 값을 설정하려면 PRAGMA KEY (* after * REKEY)를 수행해야합니다. (fmdb 함수가 무엇을 번역하는지 모르겠다. 아마도'rekey'는 PRAGMA REKEY로 변환 될 것이고'key' 또는'setkey' 함수도 있어야합니다.) –

+0

SQLite는 DB가 특정 상대적으로 "순수한"상태로 재구성됩니다. 열려있는 쿼리 등이 없어야하며 REKEY를 수행하기 전에 닫고 다시 여야 할 수도 있습니다 - 세부 정보를 잊어 버립니다.) –

+0

편집 내용을 참조하십시오. – ort11

답변

0

트릭을 예를 참조하십시오였습니다 데이터베이스가 암호화를 확인하기 위해 사용되는 경우 (다음 열 응용 프로그램)가 이미 암호화 될 때, 선택을하기 위해 키를 사용하지 않으면 실패하지만 데이터베이스를 닫은 다음 키로 다시 열어야합니다.

3

이 질문에 대한 이전 의견은 모두 잘못되었습니다. rekey를 사용하여 일반 텍스트 데이터베이스를 암호화 할 수 없습니다. Rekey는 암호화 된 데이터베이스에서 암호화 키를 변경하는 데에만 사용됩니다.

일반 텍스트 데이터베이스를 암호화하는 올바른 방법은 첨부 및 수출이다 - 여기 http://sqlcipher.net/sqlcipher-api/#sqlcipher_export

+0

글쎄, 지금이 짓을하고 데이터베이스가 잘 아첨과 함께,하지만 단 한 번만 암호화합니다. 동일한 암호로 데이터베이스를 다시 열려고하면 암호가 암호화되어 열리지 않는다고 말합니다. – ort11

+0

원본 데이터베이스를 닫고 새 암호화 된 데이터베이스를 다시 열고 키를 다시 설정 했습니까? –

관련 문제