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).get Path(), null,

VERSION, KEY);

mContext = context;

}

public void onCreate(SQLiteDatabase arg0, ConnectionSo urce connSource) {

try {

TableUtils.createTableIfNotExists(connSource, Use r.class);

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public void onUpgrade(SQLiteDatabase db, ConnectionSo urce 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 getReadableDatabas e(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 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端的本地数据库加密是应安全需求,并不是所有的项目都需要加密,希望我的经验能够带给你帮助

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180330G0J0JW00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券