sqlite暗号化/復号化 + sqlcipher + iPhone
質問
iPhoneプロジェクトでSQLiteデータベースを暗号化/復号化しようとしています。 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);
}
SQLCipher Googleグループのこのトピックに関する投稿を読みましたが、復号化することはできません。どんな助けも高く評価されます。
解決
メーリングリストからの繰り返し:
既存の非暗号化されたデータベースを取得しようとしている場合は、暗号化してからバックバックしようとする場合、推奨されるアプローチはRekeyを使用するのではなく、添付のデータベースを使用して標準とSQLCipherデータベース間でデータをコピーすることです。ここには、より多くの情報と具体的な例があります。
http://www.zetetic.net/blog/2009/12/29/how-to-encrypt-a-plaintext-sqlite-database-to-use-sqlcipher/
代わりに、SQLCipherを使用して一般的にデータを暗号化しようとしている場合(つまり、既存のデータベースから変換されない)、sqlite3_keyを使用する必要があります。基本的にデータベースを開き、キーを提供してからSQL呼び出しを行います。個別の暗号化 /復号化の手順はありません - そのすべては、SQLCipherコードによってその場で処理されます。以前に投稿したコードでは、Rekeyをまったく呼び出すことはありません。データベースを開くたびにPragmaキーを呼び出してから、sqlite_masterが読みやすいことを確認するためにクイックチェックを実行します。