2012-05-01 6 views
5

Mam reset pliku bazy danych w pliku assets.przy użyciu SQLCipher z dostarczonym przez Androida plikiem bazy danych sqlite

Jak mogę użyć SQLCipher do zaszyfrowania bazy danych w systemie Android?

+0

Ponieważ dostarczona baza danych będzie już zaszyfrowana, nie będzie można ponownie zaszyfrować jej za pomocą wybranego przez użytkownika hasła. Oznacza to, że szyfrowanie nie ma sensu, więc po prostu użyj zwykłego SQLite, być może z 'SQLiteAssetHelper', aby obsłużyć część pakiet-baza-w-zasobach. – CommonsWare

+1

co masz na myśli, że "przesłana baza danych będzie już zaszyfrowana", nie zaszyfrowałam jej? – user4o01

+0

Ah! nieważne, moje przeprosiny. – CommonsWare

Odpowiedz

9

To będzie nieco skomplikowane. Ponieważ format pliku bazy danych różni się między SQLite i SQLCipher dla Androida, a ponieważ chcesz wysłać niezaszyfrowaną bazę danych, będziesz musiał zrobić kilka rzeczy.

Po pierwsze, otrzymam SQLiteAssetHelper, aby dostarczyć niezaszyfrowaną bazę danych do środowiska.

Następnie użyj standardowego SQLCipher dla Androida, aby utworzyć pustą, ale zaszyfrowaną bazę danych.

Następnie należy zaimplementować kod w celu skopiowania danych z zaimportowanej, ale niezaszyfrowanej bazy danych i wstawić ją do pustej, ale zaszyfrowanej bazy danych.

Po wykonaniu tej czynności można zamknąć i usunąć spakowaną, ale niezaszyfrowaną bazę danych i po prostu użyć zaszyfrowanej.

Może to zrobić przydatne rozszerzenie do SQLiteAssetHelper, kiedyś ...

+0

Nie mogę zaszyfrować tego przed wysłaniem bazy danych za pomocą szyfrowania? – user4o01

+0

@ user4o01: Nie, ponieważ baza danych powinna być zaszyfrowana przy użyciu wybranego hasła użytkownika. – CommonsWare

+0

, więc jeśli ktoś dostanie mój plik APK otrzyma bazę danych i może odczytać zawartość? – user4o01

2

Dotyczą one sposobu korzystania SQLCipher szczegółowo na swojej stronie internetowej here

Zasadniczo można pobrać swoje pliki binarne, ustawić je w projekcie, a następnie użyć ich klasę SQLiteDatabase zamiast standardowego androida klasy SQLiteDatabase .:

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

Jednak format pliku bazy danych jest inny, więc nie można go używać z niezaszyfrowanym plikiem bazy danych, który wstępnie pakujesz z aplikacją lub pobierasz skądś. – CommonsWare

+0

Arrgh. Nie czytałem wystarczająco daleko w swoich dokumentach, aby zdać sobie z tego sprawę, i popełniłem błąd zakładając, że jest to wersja dla Androida, która byłaby automagicznie kompatybilna (tak, wiem, zły błąd). Dziękuję za wskazanie. – Barak

1

Kod Poniższy fragment może być wykorzystywane do tworzenia wielu tabel w bazie danych SQLite Szyfrów:

używać tych Import:

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

Teraz możesz wykonywać wszystkie metody CRUD dla obu tabel. Po prostu upewnij się, że każda metoda ma SQLiteDatabase jako argument przedstawiony w metodzie getAllUsers().

Powiązane problemy