android中有些時候會將一些隱私數據存放在sqlite數據庫中,在root過的手機中通過RE就能夠輕鬆的打開並查看數據庫所有內容,所以對隱私數據的保護就有兩個方法:①將隱私數據自行加密後存入數據庫,別人即使打開查看也不知道是什麼數據;②將整個數據庫進行加密,別人根本就打不開。對於一個數據庫中所有數據都需要加密的情況,直接對數據庫進行加密是很好的一個解決方案。
SQLCipher提供兩個版本,一個收費版,一個免費版。收費和免費的功能沒多大差別,只是收費的集成更簡單方便~這裏用免費版進行舉例:
1、下載 sqlcipher-for-android-community-v3.2.0.zip
2、在android studio中新建 assets 文件夾,將下載的文件中assets文件夾中的icudt46l.zip文件拷貝到此處:
3、在 mian 目錄下新建jniLibs文件夾,並將下載文件中libs文件夾中對應不同平臺so文件的文件夾拷貝到此文件夾下;
4、將libs下的sqlcipher.jar文件拷貝到 項目的 libs 文件夾下(工程視圖切換成project視圖);
5、將 sqlcipher.jar “add as library”
6、建立 mySqliteOpenHelper 類,繼承自導入jar包的 net.sqlcipher.database.SQLiteOpenHelper 類。
import android.content.Context;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
public class mySqliteOpenHelper extends SQLiteOpenHelper {
public mySqliteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table Book(" +
"_id integer primary key autoincrement," +
"name text," +
"price integer)");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2) {
}
}
在操作數據庫的類中如下操作:
......
SQLiteDatabase.loadLibs(this);//一定不要忘記這句~~
mySqliteOpenHelper helper = new mySqliteOpenHelper(this, "book.db", null, 1);
//此處指定打開數據庫需要的password
db = helper.getWritableDatabase("pwd");
db.delete("Book",null,null);//清空數據庫
......
ContentValues values = new ContentValues();
values.put("name", "JAVA編程思想");
values.put("price", 330);
db.insert("Book", null, values);
Cursor cursor = db.query("Book", null, null, null, null, null, null);
while (cursor.moveToNext()){
System.out.println("name:"+cursor.getString(cursor.getColumnIndex("name")));
System.out.println("price:"+cursor.getString(cursor.getColumnIndex("price")));
}
cursor.close();