2012-05-01 4 views
5

assetsファイルにデータベースファイルがリセットされています。SQLCipherを使用して、アンドロイド出荷sqliteデータベースファイル

SQLCipherを使用してアンドロイドのデータベースを暗号化するにはどうすればよいですか?

+0

出荷されたデータベースは既に暗号化されているため、ユーザーが選択したパスワードで再暗号化することはできません。これは、暗号化が無意味であることを意味します。したがって、通常はSQLiteを使用してください。おそらく 'SQLiteAssetHelper'を使用してパッケージ内のデータベースインアセット部分を処理してください。 – CommonsWare

+1

「出荷されたデータベースは既に暗号化されています」という意味はどうですか?私はそれを暗号化していませんか? – user4o01

+0

ああ!決して気にしない、私の謝罪。 – CommonsWare

答えて

9

これは少し複雑になるでしょう。 Android用のSQLiteとSQLCipherではデータベースのファイル形式が異なるため、暗号化されていないデータベースを出荷したいので、いくつかのことを行う必要があります。

まず、暗号化されていないデータベースを環境に配信するには、SQLiteAssetHelperが必要です。

次に、Android用の標準SQLCipherを使用して、空でも暗号化されたデータベースを作成します。

次に、パッケージ化された暗号化されていないデータベースからデータをコピーし、それを空の暗号化データベースに挿入するコードを実装する必要があります。

これがすべて完了したら、パッケージ化された暗号化されていないデータベースを閉じて削除し、暗号化されたデータベースを使用するだけです。

これはいつの日か...

+0

私は暗号でデータベースを出荷する前に暗号化できませんでしたか? – user4o01

+0

@ user4o01:いいえ。データベースをユーザーの選択したパスワードで暗号化する必要があるためです。 – CommonsWare

+0

だから私のAPKファイルを取得すると、データベースを取得し、コンテンツを読むことができますか? – user4o01

2

彼らはhere

は、基本的にはあなたが彼らのバイナリをダウンロードし、自分のウェブサイト上で詳細にSQLCipherを使用するプロジェクトでそれらを設定して、標準のAndroid SQLiteDatabaseクラスの代わりに自分のSQLiteDatabaseクラスを使用する方法をカバー:

import info.guardianproject.database.sqlcipher.SQLiteDatabase; 
+0

ただし、データベースのファイル形式が異なるため、アプリで事前にパッケージ化したり、どこかからダウンロードしたりする暗号化されていないデータベースファイルでは使用できません。 – CommonsWare

+0

Arrgh。それを実現するためにドキュメントを十分に読んでいないし、それが自動的に互換性がある(ええ、私は知っている、悪い間違い)アンドロイドのバージョンだったので、間違いを犯した。それを指摘してくれてありがとう。 – Barak

1

次のコードの抜粋は、SQLiteの暗号データ​​ベースに複数のテーブルを作成するために使用することができ、SQLiteAssetHelperに便利な拡張機能を作るかもしれません:

は、これらの輸入品を使用します。

import java.sql.SQLException; 
import net.sqlcipher.database.SQLiteDatabase; 
import net.sqlcipher.database.SQLiteOpenHelper; 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.util.Log; 

/** Helper to the database, manages versions and creation */ 

    public class DBAdapter extends SQLiteOpenHelper { 
     private static final String DATABASE_NAME = "Test"; 
     private static final int DATABASE_VERSION = 1; 

     // Table name 
     public static final String TABLE_1 = "Table1"; 
     public static final String TABLE_2 = "Table2"; 

     // Column names for Table1 table 
     static final String KEY_PASSWORD = "password"; 
     static final String KEY_USER = "user"; 

     // Column names for Table2 table 
     static final String KEY_EVENT = "event"; 
     static final String KEY_USERNAME = "username"; 


     public DBAdapter(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      String sql1 = "create table " + Table_1 + " (" + KEY_USER + " text primary key, " + KEY_PASSWORD + " text not null);"; 
      String sql2 = "create table " + Table_2 + " (" + KEY_EVENT + " text primary key, " + KEY_USERNAME + " text not null FOREIGN KEY(" + KEY_USERNAME + ") REFERENCES " + TABLE_1 + "(" + KEY_USER + "));"; 
      db.execSQL(sql1); 
      db.execSQL(sql2); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      if (oldVersion >= newVersion){ 
       return; 
      } 

      String sql = null; 
      if (oldVersion == 1) 
       sql = "alter table " + TABLE_1 + " add note text;"; 
      if (oldVersion == 2) 
       sql = ""; 

      Log.d("EventsData", "onUpgrade : " + sql); 
      if (sql != null) 
       db.execSQL(sql); 
     } 

     public Cursor getAllUsers(String username, SQLiteDatabase db){ 
      return db.query(TABLE_1, ...); 
     } 

     public Cursor getAllEvents(String event, SQLiteDatabase db){ 
      return db.query(TABLE_2, ...); 
     } 
    } 

これで、両方のテーブルのすべてのCRUDメソッドを実行できます。 getAllUsers()メソッドに示されているように、各メソッドの引数としてSQLiteDatabaseがあることを確認してください。

関連する問題