#Android基于ormlite框架的数据库加密
项目中期安全突然说本地数据库要进行加密,由于项目的本地数据库是用的ormlite框架,在网上搜了很多Android本地数据库加密的方法基本上都是用的SQLCipher开源框架进行的对SQLite数据库加密,由于项目本身用的是ormlite框架,因此不能直接使用,后来查了很多相关的资料,终于解决了安全的需求,特此记下,以备后用。
由于下面需要用到SQLCipher框架,先介绍一下:
##SQLCipher简介:
SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,SQLCipher具有占地面积小、性能因此它非常适合嵌入式应用的数据库保护,非常适合于移动开发。
优势:
- 加密性能高、开销小,只要5-15%的开销用于加密
- 完全做到数据库100%加密
- 采用良好的加密方式(CBC加密模式)
- 使用方便,做到应用级别加密
- 采用OpenSSL加密库提供的算法
##所需jar包
- ormlite-android-encryption.jar
- sqlcipher.jar
- guava-r09.jar
- nineoldandroids.jar
##原理分析
其实原理很简单,就是在ormlite的基础上重写了SQLite数据库getReadableDatabase()方法和getWritableDatabase()方法,就是在读数据库和写数据库的时候加上key
public class SQLiteHelper extends OrmLiteSqliteOpenHelper {
public static final String TAG = "SQLiteHelper";
//数据库版本号
public static final int VERSION = 1;
//数据库名称
private static String DB_NAME = "test.db";
//读写数据库所用到的key
private static String KEY = "key";
Context mContext;
public SQLiteHelper(Context context) {
super(context, context.getDatabasePath(DB_NAME).getPath(), null,
VERSION, KEY);
mContext = context;
}
public void onCreate(SQLiteDatabase arg0, ConnectionSource connSource) {
try {
TableUtils.createTableIfNotExists(connSource, User.class);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void onUpgrade(SQLiteDatabase db, ConnectionSource connSource,
int oldNum, int newNum) {
try {
TableUtils.dropTable(connectionSource, User.class, true);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void close() {
super.close();
}
public SQLiteDatabase getReadableDatabase() {
return getReadableDatabase(KEY);
}
public SQLiteDatabase getWritableDatabase() {
return getWritableDatabase(KEY);
}
public synchronized SQLiteDatabase getReadableDatabase(String arg0) {
// TODO Auto-generated method stub
return super.getReadableDatabase(arg0);
}
public synchronized SQLiteDatabase getWritableDatabase(String arg0) {
// TODO Auto-generated method stub
return super.getWritableDatabase(arg0);
}
}
到此,Android 端基于本地数据库(ormlite)框架的加密就搞定了,是不是很简单dao的用法和增删该查都跟ormlite操作一样
##基于ormlite数据库框架的批量插入数据(知识点很小,但是用途很大)
/**
* 批量插入
*/
public void insertAllUsers(List<User> users){
DatabaseConnection conn = null;
Savepoint savepoint = null;
try {
conn = userDao.startThreadConnection();
savepoint = conn.setSavePoint("bulk_insert");
for (User user : users) {
userDao.create(user);
}
} catch (SQLException e) {
} finally {
if (conn != null) {
try {
conn.commit(savepoint);
userDao.endThreadConnection(conn);
} catch (SQLException e) {
}
}
}
}
Android端的本地数据库加密是应安全需求,并不是所有的项目都需要加密,希望我的经验能够带给你帮助