SQLite шифрование / дешифрование + SQLCICH + iPhone
Вопрос
Я пытался зашифровать / расшифровать базу данных SQLite в моем проекте iPhone. Я могу зашифровать базу данных с помощью метода Rekey. Но я не могу расшифровать это. Я сохранил свой файл sqlite.db в папке. В настоящее время пробует его на симуляторе.
Кодовый фрагмент:
[[SQLiteDB sharedSQLiteDB] open:<path to the folder> withKey:@""];
[[SQLiteDB sharedSQLiteDB] reKey:@"abc"];
[[SQLiteDB sharedSQLiteDB] close];
[[SQLiteDB sharedSQLiteDB] open:<path to the folder> withKey:@"abc"];
[[SQLiteDB sharedSQLiteDB] reKey:@""];
.....
- (BOOL)open:(NSString *)path withKey:(NSString *)masterKey {
if (sqlite3_open([path fileSystemRepresentation], &_db) != SQLITE_OK) {
NSLog(@"SQLite Opening Error: %s", sqlite3_errmsg(_db));
return NO;
}
if(masterKey)
sqlite3_exec(_db, [[NSString stringWithFormat:@"PRAGMA key = '%@'", masterKey] UTF8String], NULL, NULL, NULL);
if (sqlite3_exec(_db, (const char*) "SELECT count(*) FROM sqlite_master", NULL, NULL, NULL) != SQLITE_OK)
{
[self close];
NSLog(@"SQLite Key Error!");
return NO;
}
filePath = [path retain];
return YES;
}
......
- (void)reKey:(NSString *)masterKey
{
sqlite3_exec(_db, [[NSString stringWithFormat:@"PRAGMA rekey = '%@'", masterKey] UTF8String], NULL, NULL, NULL);
}
Я прочитал посты на этой теме в группах Google SQLCICH, но я не могу расшифровать его. Любая помощь будет высоко ценится.
Решение
Ремонтирование из списка рассылки:
Если вы пытаетесь принять существующую не зашифрованную базу данных, шифруйте его, а затем расшифруйте его назад, наш рекомендуемый подход не должен использовать Rekey, но вместо этого использовать прикрепленные базы данных для копирования данных между стандартным и базой данных SQLCIPH. Здесь больше информации и конкретного примера:
http://www.zeticet.net/blog/2009/12/29/how-to-encrypt-a-plaintext-sqlite-database-to-use-sqlCIfr/
Если вместо этого вы просто пытаетесь использовать SQLCIFIFIFH для шифрования данных в целом (то есть без преобразования из ранее существующей базы данных), то вам просто нужно использовать SQLite3__Key. Вы в основном просто открываете базу данных, предоставляете ключ, а затем сделать вызовы SQL. Нет отдельных шагов шифрования / дешифрования - все это обрабатывается на лету кодом SQLCIPHIPH. В коде вы разместили ранее, вы никогда не звоните вообще. Каждый раз вы открываете базу данных, вы вызываете клавишу Pragma, а затем запустите быструю проверку, чтобы убедиться, что SQLite_Master является читабером.