如何在SQLCipher中加密/解密

时间:2013-01-29 12:07:54

标签: android sqlcipher

我正在努力解决如何使用SQLCipher加密/解密数据库。

在我的代码中我应该从哪里开始。以及如何开始。

如果可能,请编辑此代码。

我按照这个链接但没有得到如何做到这一点。 http://sqlcipher.net/sqlcipher-api/#key

我的数据库文件: -

import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
import android.content.Context;
import android.util.Log;

public class DatabaseClass extends SQLiteOpenHelper 
{
    /**
     * Constants 
     */
    public final static String DATABASE_NAME ="mycipherdatabase.db";
    public final static String NAME ="name";
    public final static String ADDRESS ="address";
    public final static String CITY ="city";

    public static String pass = "1234";
    public DatabaseClass(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    /**
     * called once
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL( "CREATE TABLE mylistdata(_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT, address TEXT,city TEXT);");

        Log.v("inside", "oncreate");
    }

    /**
     * called when we upgrade(change)the version number of database
     * onCreate also called after changing the version
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP Table mylistdata");
        onCreate(db);
    }
}

OtherActivity使用此DB: -

/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        SQLiteDatabase.loadLibs(this);
        File file = getDatabasePath(DatabaseClass.DATABASE_NAME);
        file.mkdir();
        file.delete();
        sqldb = SQLiteDatabase.openOrCreateDatabase(file,key, null);
        db = new DatabaseClass(this);

        etname = (EditText)findViewById(R.id.name);
        etadd = (EditText)findViewById(R.id.add);
        etcity = (EditText)findViewById(R.id.city);
        result = (ListView)findViewById(R.id.mylist);
    }

    /**
     *insert data in to database 
     */
    public void saveData(View v) {
        ContentValues insertData = new ContentValues();
        insertData.put(DatabaseClass.NAME, etname.getText().toString());
        insertData.put(DatabaseClass.ADDRESS, etadd.getText().toString());
        insertData.put(DatabaseClass.CITY, etcity.getText().toString());

        db.getWritableDatabase(key).insert("mylistdata", DatabaseClass.NAME , insertData);
        db.close();

        resetEditText();
        Toast.makeText(this,"Data saved", Toast.LENGTH_SHORT).show();
    }

3 个答案:

答案 0 :(得分:4)

嗯,代码存在很多问题,我认为你必须更好地了解Android中的SQLite结构,技术上, Android SQLite SQLCipher 外观完全一样(密码除外)。因此,如果您编写标准的SQLite应用程序,可以轻松地将其更改为SQLCipher,

我建议你在android中阅读关于SQLite的这篇精彩文章,

http://www.vogella.com/articles/AndroidSQLite/article.html

提示:使用 SQLiteOpenHelper 时无需调用 openOrCreateDatabase , 调用 getWritableDatabase 可以完成这项工作,您也必须拥有 SQLiteDatabase 对象,该对象取自 getWritableDatabase 方法,调用 getWritableDatabase 对于每次要插入记录都不对。

这些部分将被删除,

     // in onCreate method
     File file = getDatabasePath(DatabaseClass.DATABASE_NAME);
     file.mkdir();
     file.delete();
     sqldb = SQLiteDatabase.openOrCreateDatabase(file,key, null);
     db = new DatabaseClass(this);

     // in saveData method
      db.getWritableDatabase(key).insert("mylistdata", DatabaseClass.NAME ,               insertData);

相反,你必须做这样的事情

     // in onCreate method
     try{
        sqldb = new DatabaseClass(this).getWritableDatabase(key);
     }catch(Throwable e){
        // error occurred
     }

     // in insert action
     try{
        sqldb.insert("tablename", null, contentValues);
     }catch(Throwable e){
        // error occurred
     }

通过这种方式,您还可以查看是否发生了错误, 请记住,不要在短语中使用例外类,只能使用 Throwable

此外,我不建议在每次插入动作时关闭连接,最好在更高级别处理

答案 1 :(得分:1)

尝试使用SQLiteDatabase.openOrCreateDatabase,如下所述:http://sqlcipher.net/sqlcipher-for-android/

答案 2 :(得分:0)

这可能是一个好的开始, https://guardianproject.info/code/sqlcipher/

更多来自Android Docs, http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onConfigure(android.database.sqlite.SQLiteDatabase)

对我来说,关键要点是将sqlcipher jar添加到你的android deps中,并确保你设置密钥/密码PRAGMA stmts。