Android基于ormlite框架的数据库加密

本文转载自:https://my.oschina.net/u/2561871/blog/1512131

项目中期安全突然说本地数据库要进行加密,由于项目的本地数据库是用的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端的本地数据库加密是应安全需求,并不是所有的项目都需要加密,希望我的经验能够带给你帮助

【总监】十二春秋之,3483099@qq.com; 【Master】zelo,616701261@qq.com;【运营】狼行天下,897221533@qq.com; 【产品设计】流浪猫,364994559@qq.com;【体验设计】兜兜,2435632247@qq.com; 【iOS】淘码小工,492395860@qq.com;iMcG33K,imcg33k@gmail.com;【Android】人猿居士,1059604515@qq.com;思路的顿悟,1217022114@qq.com; 【java】首席工程师MR_W,feixue300@qq.com;【测试】土镜问道,847071279@qq.com; 【数据】喜乐多,42151960@qq.com;【安全】保密,你懂的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值