新しい暗号化されたデータベースの作成に問題があります。私はこれについて調査を行いましたが、これらは私が試したいくつかの解決策です。
http://sqlcipher.net/design/に基づく端末の使用
sqlite3 sqlcipher.db
sqlite> PRAGMA KEY='test123';
sqlite> CREATE TABLE t1(a,b);
sqlite> INSERT INTO t1(a,b) VALUES ('one for the money', 'two for the show');
sqlite> .quit
~ $ hexdump -C sqlcipher.db
hexdump を実行しても、暗号化されていないデータベース テキストが表示されます。
ios で既存の Db にアタッチされた方法を実行します。
- (void)encryptDB
{
sqlite3 *unencrypted_DB;
NSString *path_u = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
stringByAppendingPathComponent:@"unencrypted.db"];
if (sqlite3_open([path_u UTF8String], &unencrypted_DB) == SQLITE_OK) {
NSLog(@"Database Opened");
// Attach empty encrypted database to unencrypted database
sqlite3_exec(unencrypted_DB, "ATTACH DATABASE 'encrypted.db' AS encrypted KEY '1234';", NULL, NULL, NULL);
// export database
sqlite3_exec(unencrypted_DB, "SELECT sqlcipher_export('encrypted');", NULL, NULL, NULL);
// Detach encrypted database
sqlite3_exec(unencrypted_DB, "DETACH DATABASE encrypted;", NULL, NULL, NULL);
NSLog (@"End database copying");
sqlite3_close(unencrypted_DB);
}
else {
sqlite3_close(unencrypted_DB);
NSAssert1(NO, @"Failed to open database with message '%s'.", sqlite3_errmsg(unencrypted_DB));
}
}
上記の実行に問題はありませんが、encrypted.db がドキュメント フォルダーに表示されません。
アプリケーションでsslとsqlcipherを設定した後。これを使って
- (void) openCipherDB
{
NSString *databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
stringByAppendingPathComponent: @"unencrypted.db"];
NSLog(@"database path %@", databasePath);
sqlite3 *db;
if (sqlite3_open([databasePath UTF8String], &db) == SQLITE_OK)
{
//sqlite3_exec(_db, "ATTACH DATABASE 'xyz.sqlite' AS encrypted KEY 'test';", NULL, NULL, &t)
const char* key = [@"secret" UTF8String];
int sqlite3_key(sqlite3 *db, const void *pKey, int nKey); //i added this after seeing SO
sqlite3_key(db, key, strlen(key));
if (sqlite3_exec(db, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) {
// password is correct, or, database has been initialized
NSLog(@"database initialize");
}
else
{
NSLog(@"incorrect pass");
// incorrect password!
}
sqlite3_close(db);
}
}
それは私に間違ったパスワードの NSLog を与え、もちろん私のデータベースも暗号化されていません。
データベースを暗号化するために他に何ができますか? ありがとう。