2012-05-01 33 views
5

Tôi có một tệp cơ sở dữ liệu được đặt lại trong tệp assets.sử dụng SQLCipher với tệp cơ sở dữ liệu sqlite được vận chuyển android

Tôi làm cách nào để sử dụng SQLCipher để mã hóa cơ sở dữ liệu trong Android?

+0

Vì cơ sở dữ liệu đã được chuyển sẽ được mã hóa, bạn sẽ không thể mã hóa lại bằng mật khẩu đã chọn của người dùng. Điều này có nghĩa là mã hóa là vô nghĩa, vì vậy chỉ cần sử dụng SQLite thông thường, có lẽ với 'SQLiteAssetHelper' để xử lý phần package-the-database-in-assets. – CommonsWare

+1

ý của bạn là "cơ sở dữ liệu đã xuất xưởng đã được mã hóa", tôi chưa mã hóa nó? – user4o01

+0

Ah! không sao, xin lỗi tôi. – CommonsWare

Trả lời

9

Điều này sẽ hơi phức tạp một chút. Vì định dạng tệp cơ sở dữ liệu khác nhau giữa SQLite và SQLCipher cho Android, và vì bạn muốn gửi một cơ sở dữ liệu không được mã hóa, bạn sẽ phải làm một vài việc.

Trước tiên, tôi sẽ nhận được SQLiteAssetHelper để cung cấp cơ sở dữ liệu không được mã hóa cho môi trường của bạn.

Sau đó, sử dụng SQLCipher chuẩn cho Android để tạo cơ sở dữ liệu trống nhưng được mã hóa.

Tiếp theo, bạn sẽ cần triển khai mã để sao chép dữ liệu ra khỏi cơ sở dữ liệu được đóng gói nhưng không được mã hóa và chèn nó vào cơ sở dữ liệu trống nhưng được mã hóa.

Khi đã xong, bạn có thể đóng và xóa cơ sở dữ liệu được đóng gói nhưng không được mã hóa và chỉ sử dụng cơ sở dữ liệu được mã hóa.

này có thể làm cho một phần mở rộng hữu ích cho SQLiteAssetHelper, một ngày nào đó ...

+0

tôi không thể mã hóa nó trước khi tôi gửi cơ sở dữ liệu với mật mã? – user4o01

+0

@ user4o01: Không, vì cơ sở dữ liệu phải được mã hóa bằng mật khẩu đã chọn của người dùng. – CommonsWare

+0

vì vậy nếu có ai nhận được tập tin apk của tôi sẽ nhận được cơ sở dữ liệu và có thể đọc nội dung? – user4o01

2

Họ giới thiệu cách sử dụng SQLCipher chi tiết trên trang web của họ here

Về cơ bản bạn tải về tập tin nhị phân của họ, thiết lập chúng trong dự án của bạn và sau đó sử dụng lớp SQLiteDatabase của họ thay vì lớp SQLiteDatabase android chuẩn .:

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

Tuy nhiên, định dạng tệp cơ sở dữ liệu là khác nhau, vì vậy bạn không thể sử dụng tệp này với tệp cơ sở dữ liệu không được mã hóa mà bạn đã gói trước với ứng dụng của mình hoặc tải xuống từ đâu đó. – CommonsWare

+0

Arrgh. Đã không đọc đủ xa vào tài liệu của họ để nhận ra điều đó, và đã mắc sai lầm khi giả định vì nó là một phiên bản cho android nó sẽ tự động tương thích (vâng, tôi biết, sai lầm xấu). Cảm ơn đã chỉ ra điều đó. – Barak

1

sau Đoạn trích mã có thể được sử dụng để tạo ra nhiều bảng trong một cơ sở dữ liệu SQLite Cipher:

Sử dụng các hàng nhập khẩu:

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, ...); 
     } 
    } 

Bây giờ bạn có thể thực hiện tất cả các phương pháp CRUD cho cả hai bảng. Chỉ cần đảm bảo rằng mỗi phương thức đều có một đối số SQLiteDatabase như được hiển thị trong phương thức getAllUsers().

Các vấn đề liên quan