5

SQLCipherを使用して、暗号化されていないsqlite3データベースのコンテンツを暗号化されたデータベースに追加しようとしています。私はこれとこれから私がやろうとしていることに基づいています。しかし、いくつかのことが私にはわかりません。

  1. ATTACH DATABASEでは、暗号化されたデータベースはタイプである必要があり.dbますか?.sqlite元のデータベースと一致させることはできますか?

  2. 上記の暗号化されたデータベースはすでに存在している必要がありますか?もしそうなら、それはアプリのどこにあるべきですか?ファイルへのパス(ドキュメントディレクトリなど)を指定する必要がありますか?

  3. 暗号化に成功したデータベースはどこにありますか?どこに保存されますか?

これが私のコードです:

+ (void)encryptDB
{
    sqlite3 *unencrypted_DB;
    NSString *path_u = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] 
                  stringByAppendingPathComponent:@"dict.sqlite"];

    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 'dict_encrypted.sqlite' AS encrypted KEY '1234';", NULL, NULL, NULL);

        // Create new tables within encrypted database to match those in unencrypted database
        sqlite3_exec(unencrypted_DB, "CREATE TABLE encrypted.t1(A,B,C);", NULL, NULL, NULL);

        // Copy items from unencrypted database into encrypted database
        sqlite3_exec(unencrypted_DB, "INSERT INTO encrypted.t1 SELECT * FROM t1;", 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));
    }
}
4

3 に答える 3

6

最新バージョンのSQLCipherには、コードを短くして既存のデータベース構造に接続しないsqlcipher_export()関数があります。

+ (void)encryptDB
{
    sqlite3 *unencrypted_DB;
    NSString *path_u = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] 
                         stringByAppendingPathComponent:@"dict.sqlite"];

    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 'dict_encrypted.sqlite' 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));
    }
}
于 2012-04-03T16:35:58.580 に答える
5
  1. 暗号化されたデータベースは.dbタイプである必要がありますか?-いいえ、任意の拡張機能を使用できます。
  2. 上記の暗号化されたデータベースはすでに存在している必要がありますか?-いいえ、データベースはすでに存在している必要はありません。存在しないデータベースをアタッチすると、新しいデータベースが作成されます
  3. ファイルへのパス(ドキュメントディレクトリなど)を指定する必要がありますか?-はい、データベースへのパスを指定する必要があります。指定しないと、アプリの現在の作業ディレクトリが使用されます。iOSでは、通常、アプリのドキュメントディレクトリを含むファイル名へのフルパスを指定する必要があります。
  4. 暗号化に成功したデータベースはどこにありますか?-暗号化されたデータベースは、attachに配置するように指示した場所に配置されます。#3に従って、iOS用にビルドしている場合は、ファイル名にドキュメントディレクトリへのフルパスを含めると、暗号化されたデータベースがそこに配置されます。
于 2012-01-20T15:43:51.770 に答える
0

まあ、私は一度もやったことがなく、ATTACH DATABASE私が使用したSQLCiperのバージョンはおそらくあなたのものとは異なりますが、(私が扱ったSQLCipherの実装の場合)ファイルオープンロジックは標準のSQLiteであり、同じように動作しますSQLCipherなしのように。

したがって、接尾辞やその他の特定のものは必要ありませ.dbん。好きなものを使用できます。

新しいデータベースを発行するまでREKEYは完全に「通常」であり、SQLiteの「通常」の方法で作成/削除されます。

繰り返しになりますが、最初にDB(およびそれ)ATTACH DATABASEを作成してから接続するのが最善だと思います。REKEY

于 2012-01-19T20:43:49.637 に答える