0

このリンクで説明されているように、SQLCipher をプロジェクトに含めました: http://sqlcipher.net/ios-tutorial/

しかし、上記のリンクから説明を読んだデータベースを暗号化する方法がわかりませんが、取得できません。
実際に私がやっていることは、アプリケーションが初めて開いている場合、データベースを (つまり、暗号化なしで) ドキュメント ディレクトリにコピーすることです。もう 1 つ、バンドルからドキュメント ディレクトリにコピーするときに、データベースが空白になります。
データベースを開いた後に sqlite3_key 関数を使用しようとしましたが、何も暗号化されていません。しかし、バンドルからドキュメントディレクトリにコピーするときにデータベースを暗号化する方法のようなものは見つかりませんでした。FMDBを利用する予定ですので、それに合わせて回答いただけると助かります。
その方法を教えてください。または、チュートリアルがある場合は方向を示してください。また、それを行うための標準的なアプローチを提案してください。

4

2 に答える 2

2

これを達成する方法に関する簡単なチュートリアルを探している人のために、私はそれを作成することができました: http://www.guilmo.com/fmdb-with-sqlcipher-tutorial/

しかし、最も重要な部分は、既存の DB を開いて、暗号化された新しい DB をアタッチすることです。次に、FMDB 接続でキーを設定します。

SQLCipher - データベースの暗号化

// Import sqlite3.h in your AppDelegate
#import <sqlite3.h>

// Set the new encrypted database path to be in the Documents Folder
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDir = [documentPaths objectAtIndex:0];
NSString *ecDB = [documentDir stringByAppendingPathComponent:@"encrypted.sqlite"];

// SQL Query. NOTE THAT DATABASE IS THE FULL PATH NOT ONLY THE NAME
const char* sqlQ = [[NSString stringWithFormat:@"ATTACH DATABASE '%@' AS encrypted KEY 'secretKey';",ecDB] UTF8String];

sqlite3 *unencrypted_DB;    
if (sqlite3_open([self.databasePath UTF8String], &unencrypted_DB) == SQLITE_OK) {

    // Attach empty encrypted database to unencrypted database
    sqlite3_exec(unencrypted_DB, sqlQ, 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);

    sqlite3_close(unencrypted_DB);
}
else {
    sqlite3_close(unencrypted_DB);
    NSAssert1(NO, @"Failed to open database with message '%s'.", sqlite3_errmsg(unencrypted_DB));
}

self.databasePath = [documentDir stringByAppendingPathComponent:@"encrypted.sqlite"];

SQL クエリで、DATABASE と KEY の 2 つのパラメータを設定していることに注意してください。DATABASE は、作成する暗号化されたデータベース (この場合は文字列 ecDB) へのフル パスである必要があり、KEY パラメーターはデータベースを暗号化するために使用されるキーであるため、強力なものを選択します。

FMDB 関数で、データベースを開くたびに[db setKey:@"strongKey"]を呼び出します。

// FMDatabase Example
FMDatabase *db = [FMDatabase databaseWithPath:[self getDatabasePath]];
[db open];
[db setKey:@"secretKey"];


// FMDatabaseQueue Exmple
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:[self getDatabasePath]];

[queue inDatabase:^(FMDatabase *db) {
    [db setKey:@"secretKey"];
    ...
}];

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2014-02-21T01:34:32.613 に答える
0

この手順については、SQLCipher API ページ [1] の sqlcipher_export() を使用するための「例 1: プレーンテキスト データベースを暗号化する」の下に記載されています。

[1] http://sqlcipher.net/sqlcipher-api/#sqlcipher_export

于 2012-07-04T21:13:11.997 に答える