2012-05-01 15 views
5

साथ SQLCipher का उपयोग कर रहा assets फ़ाइल में एक डेटाबेस फ़ाइल रीसेट।एंड्रॉयड भेज दिया SQLite डेटाबेस फ़ाइल

मैं SQLCipher का उपयोग कैसे एंड्रॉयड में डेटाबेस एन्क्रिप्ट करने के लिए कर सकते हैं?

+0

चूंकि शिप किया गया डेटाबेस पहले से ही एन्क्रिप्ट किया जाएगा, इसलिए आप इसे उपयोगकर्ता के चुने हुए पासवर्ड से पुनः एन्क्रिप्ट नहीं कर पाएंगे। इसका अर्थ यह है कि एन्क्रिप्शन व्यर्थ है, इसलिए पैकेज-डेटाबेस-इन-एसेट्स भाग को संभालने के लिए शायद 'SQLiteAssetHelper' के साथ नियमित SQLite का उपयोग करें। – CommonsWare

+1

आपका क्या मतलब है कि "शिप किया गया डेटाबेस पहले से ही एन्क्रिप्ट किया जाएगा" मैंने इसे एन्क्रिप्ट नहीं किया है? – user4o01

+0

आह! कभी माफी नहीं, मेरी माफ़ी। – CommonsWare

उत्तर

9

यह थोड़ा जटिल होने जा रहा है। चूंकि एंड्रॉइड के लिए SQLite और SQLCipher के बीच डेटाबेस फ़ाइल प्रारूप अलग है, और चूंकि आप एक अनएन्क्रिप्टेड डेटाबेस भेजना चाहते हैं, तो आपको कुछ चीजें करना होगा।

पहले, मैं जा रहा SQLiteAssetHelper प्राप्त करना चाहते हैं, अपने पर्यावरण के लिए एन्क्रिप्ट नहीं किए गए डेटाबेस वितरित करने के लिए।

फिर, एक खाली-लेकिन-एन्क्रिप्टेड डेटाबेस बनाने के लिए Android के लिए मानक SQLCipher का उपयोग करें।

इसके बाद, आप पैक बल्कि एन्क्रिप्ट नहीं किए गए डेटाबेस से बाहर डेटा की प्रतिलिपि कोड को लागू करने और खाली बल्कि एन्क्रिप्टेड डेटाबेस में डालने के लिए की आवश्यकता होगी।

एक बार है कि सभी से किया जाता है, तो आप को बंद करने और पैक किया बल्कि एन्क्रिप्ट नहीं किए गए डेटाबेस को हटाएँ और केवल एन्क्रिप्टेड एक का उपयोग कर सकते हैं।

यह किसी दिन SQLiteAssetHelper के लिए एक उपयोगी विस्तार कर सकता है, ...

+0

मैं सिफर के साथ डेटाबेस भेजने से पहले इसे एन्क्रिप्ट नहीं कर सका? – user4o01

+0

@ user4o01: नहीं, क्योंकि डेटाबेस को उपयोगकर्ता के चुने हुए पासवर्ड से एन्क्रिप्ट किया जाना चाहिए। – CommonsWare

+0

इसलिए यदि कोई मेरी एपीके फ़ाइल प्राप्त करेगा तो डेटाबेस प्राप्त होगा और इसे सामग्री पढ़ सकता है? – user4o01

2

वे अपनी वेबसाइट पर विस्तार से SQLCipher का उपयोग कैसे here

मूल रूप से आप अपने बाइनरी डाउनलोड, उन्हें अपनी परियोजना में स्थापित और फिर मानक एंड्रॉयड SQLiteDatabase वर्ग के बजाय उनके SQLiteDatabase क्लास का उपयोग को कवर .:

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

हालांकि, डेटाबेस फ़ाइल प्रारूप अलग है, इसलिए आप इसे किसी एन्क्रिप्टेड डेटाबेस फ़ाइल के साथ उपयोग नहीं कर सकते हैं जिसे आप अपने ऐप के साथ प्री-पैकेज करते हैं या कहीं से डाउनलोड करते हैं। – CommonsWare

+0

Arrgh। अपने दस्तावेज़ों में बहुत कुछ नहीं पढ़ा था, और यह समझने की गलती की क्योंकि यह एंड्रॉइड के लिए एक संस्करण था क्योंकि यह स्वचालित रूप से संगत होगा (हाँ, मुझे पता है, बुरी गलती)। इस पर ध्यान दिलाने के लिए धन्यवाद। – Barak

1

निम्नलिखित कोड अंश एक SQLite सिफर डेटाबेस में कई तालिकाएं बनाने के लिए इस्तेमाल किया जा सकता:

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

इन आयात का प्रयोग करें

अब आप दोनों तालिकाओं के लिए सभी सीआरयूडी विधियां कर सकते हैं। बस सुनिश्चित करें कि getAllUsers() विधि में दिखाए गए अनुसार प्रत्येक विधि में SQLiteDatabase एक तर्क के रूप में है।

संबंधित मुद्दे