sqlite數據庫加密
1.sqlite加密介紹
開源項目:sqlcihper
基於的解決方案:https://www.zetetic.net/sqlcipher/sqlcipher-for-android/
sqlite:關係型數據庫、版本3.0開源的,雖然沒有加密功能,但是作者已經提供了加密接口(收費版可用)
sqlite官方:http://sqlite.org/
開源作者提供加密解決方案,下載地址:https://s3.amazonaws.com/sqlcipher/SQLCipher+for+Android+3.1.0.zip
2.加密實現
- 1.導入jar包(Libs)、so庫(jniLibs)、資源(assets),並加載so庫
- 2.繼承net.sqlcipher.database.SQLiteOpenHelper
-
3.創建表
語法和android原生沒任何區別: db.execSQL("CREATE TABLE username(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)");
-
4.插入:需要密碼
String name = et1.getText().toString(); if(TextUtils.isEmpty(name)) return; CipherSqliteOpenHelper openHelper = new CipherSqliteOpenHelper(context); //不同之處在於:需要設置密碼 SQLiteDatabase db = openHelper.getWritableDatabase("123456"); ContentValues values = new ContentValues(); values.put("name", name); long username = db.insert("username", null, values); Toast.makeText(context, "插入成功", Toast.LENGTH_SHORT).show(); et1.setText(""); db.close();
-
5.查詢:也需要密碼
CipherSqliteOpenHelper openHelper = new CipherSqliteOpenHelper(context); SQLiteDatabase db = openHelper.getReadableDatabase("123456");//密碼 Cursor cursor = db.query("username", new String[]{"id", "name"}, null, null, null, null, null); if(cursor != null){ while (cursor.moveToNext()){ int id = cursor.getInt(0); String name = cursor.getString(1); Log.i("result", "id="+id+",name="+name); } cursor.close(); } db.close();
-
6.加密後打不開
- 7.查詢沒問題
殺死adb 和重啓adb
SDK工具包,打開ddms可以看到SQLite數據
代碼:
package com.example.sqliteciher;
import android.content.ContentValues;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.example.sqliteciher.db.MySQLiteHelper;
import net.sqlcipher.database.SQLiteDatabase;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText mEt;
private Button mBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//初始化so庫
SQLiteDatabase.loadLibs(this);
initData();
initListener();
}
/**
* 初始化視圖
* */
public void initView(){
mEt = (EditText) findViewById(R.id.et);
mBtn = (Button) findViewById(R.id.btn);
}
/**
* 初始化數據
* */
public void initData(){
}
/**
* 初始化監聽
* */
public void initListener(){
mBtn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
String name = mEt.getText().toString().trim();
if (name.isEmpty())
return;
try {//這裏要包裹異常,
MySQLiteHelper helper = new MySQLiteHelper(this);
SQLiteDatabase db = helper.getWritableDatabase("123456");
ContentValues values = new ContentValues();
values.put("name",name);
db.insert("username",null,values);
db.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.example.sqliteciher.db;
import android.content.Context;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
/**
* @項目名: SQLiteCiher2
* @包名: com.example.sqliteciher.db
* @文件名: MySQLiteHelper
* @創建者: Administrator
* @創建時間: 2017/1/28 20:03
* @描述: TODO
*/
public class MySQLiteHelper extends SQLiteOpenHelper {
private static final String TAG = "MySQLiteHelper";
public MySQLiteHelper(Context context) {
super(context, "sqlite.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("CREATE TABLE username(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}