Android开发推荐的加密框架
浏览:721 次

在项目进行过程中,安全部门突然表示应该对本地数据库进行加密。由于该项目的本地数据库使用ormlite框架,因此在互联网上搜索了许多Android本地数据库加密方法。基本上,SQLCipher开源框架用于加密SQLite数据库。因为项目本身使用ormlite框架,所以不能直接使用。随后,检查了大量相关信息,最终解决了安全要求,特此记录,以备将来使用。
由于SQLCipher框架需要在下面使用,所以让我们先介绍一下:
##SQLCipher简介:
SQLCipher是一个基于SQLite扩展的开源数据库。SQLCipher占地面积小,性能好,因此非常适合嵌入式app和移动开发的数据库保护。
优势:
高加密性能和低开销。只有5-15%的开销用于加密
完全实现数据库的100%加密
采用良好的加密模式(CBC加密模式)
易于使用并实现app级加密
采用OpenSSL加密库提供的算法
##所需的jar包
ormlite-android-encrytion.jar
sqlcipher.jar
番石榴-09.jar
nineoldandroids.jar
##原理分析
事实上,原理很简单。在ormlite的基础上,重写了SQLite数据库getReadableDatabase()方法和getWriteable数据库()方法。即,在读取和写入数据库时添加密钥
公共类SQLiteHelper扩展了OrmLiteSqliteOpenHelper{
public static final String TAG=“SQLiteHelper”;
//数据库版本号
公共静态最终int VERSION=1;
//数据库名称
private static String DB_ NAME=“test.DB”;
//用于读取和写入数据库的密钥
私有静态字符串KEY=“KEY”;
上下文mContext;
公共SQLiteHelper(上下文上下文){
super(context,context.getDatabasePath(DB_NAME)。getPath(),空,
版本、密钥);
mContext=上下文;

}
public void onCreate(SQLiteDatabase arg0,ConnectionSource connSource){
尝试{
TableUtils。createTableIfNotExists(connSource,User.class);
}catch(SQLException e){
//TODO自动生成的捕获块
e、 printStackTrace();
}
}
public void onUpgrade(SQLiteDatabase db,ConnectionSource connSource,
int oldNum,int newNum){
尝试{
TableUtils。dropTable(connectionSource,User.class,true);
}catch(SQLException e){
//TODO自动生成的捕获块
e、 printStackTrace();
}
}
公共空隙关闭(){
super.close();
}
公共SQLiteDatabase getReadableDatabase(){
return getReadableDatabase(KEY);
}
公共SQLiteDatabase getWritableDatabase(){
return getWritableDatabase(KEY);
}
公共同步SQLiteDatabase getReadableDatabase(字符串arg0){
//TODO自动生成的方法存根
return super.getReadableDatabase(arg0);

}
公共同步SQLiteDatabase getWritableDatabase(字符串arg0){
//TODO自动生成的方法存根
return super.getWritableDatabase(arg0);
}
}
到目前为止,Android端基于本地数据库(ormlite)框架的加密已经完成。使用dao、添加或删除与ormlite相同的操作是否非常简单
##基于ormlite数据库框架的批量插入数据(知识点小,但用处大)
/**
*大容量插入
*/
public void insertAllUsers(列出用户){
DatabaseConnection conn=null;
保存点保存点=空;
尝试{
conn=userDao.startThreadConnection();
savepoint=conn.setSavePoint(“bulk_insert”);
for(用户用户:用户){
userDao.create(用户);
}
}catch(SQLException e){
}最后{
如果(conn!=空){
尝试{
conn.commit(保存点);
userDao.endThreadConnection(连接);
}catch(SQLException e){
}
}
}

}
Android端本地数据库的加密应满足安全要求。并非所有项目都需要加密。我希望我的经验能对你有所帮助。