나는 이것에 대해 약간의 글이 있음을 알고 있지만, 내가 누락/현재하고 있지 않은 것이 있는지 확인하고자합니다.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
}
프레임 워크의 후드가 ...하고 있지만 데이터베이스가 암호화되지 않습니다.
PRAGMA REKEY는 귀하가 사용하는 것입니다. 물론 새로운 키 값을 설정하려면 PRAGMA KEY (* after * REKEY)를 수행해야합니다. (fmdb 함수가 무엇을 번역하는지 모르겠다. 아마도'rekey'는 PRAGMA REKEY로 변환 될 것이고'key' 또는'setkey' 함수도 있어야합니다.) –
SQLite는 DB가 특정 상대적으로 "순수한"상태로 재구성됩니다. 열려있는 쿼리 등이 없어야하며 REKEY를 수행하기 전에 닫고 다시 여야 할 수도 있습니다 - 세부 정보를 잊어 버립니다.) –
편집 내용을 참조하십시오. – ort11