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) {
}
}