Android数据库加密

4,667 阅读3分钟
原文链接: tiimor.cn

Android

Talk is cheap,show me the code

Android数据库加密,加密应用里重要的信息,避免干坏事,坏人!

加密方案

SQLite不支持加密,应用中重要的数据账号密码等容易被泄露。

加密数据库内容

在存储数据时加密内容,在查询时进行解密。但是这种方式不能彻底加密,数据库的表结构等信息还是能被查看到,另外检索数据也是一个问题。

加密数据库文件

借助SQLCipherSQLCipher是一个在SQLite基础之上进行扩展的开源数据库,它主要是在SQLite的基础之上增加了数据加密功能。

  • 加密性能高、开销小,只要5-15%的开销用于加密
  • 完全做到数据库100%加密
  • 采用良好的加密方式(CBC加密模式)
  • 使用方便,做到应用级别加密
  • 采用OpenSSL加密库提供的算法

加密内容

介绍一些常用的加密数据的方式,可以通过这些方式加密存储的数据库内容。

加密算法 描述 优点 缺点
DES,3DES 对称加密算法 算法公开、计算量小、加密速度快、加密效率高 双方都使用同样密钥,安全性得不到保证
AES 对称加密算法 算法公开、计算量小、加密速度快、加密效率高 双方都使用同样密钥,安全性得不到保证
XOR 异或加密 两个变量的互换(不借助第三个变量),简单的数据加密 加密方式简单
Base64 算不上什么加密算法,只是对数据进行编码传输
SHA 非对称加密算法。安全散列算法,数字签名工具。著名的图片加载框架Glide在缓存key时就采用的此加密 破解难度高,不可逆 可以通过穷举法进行破解
RSA 非对称加密算法,最流行的公钥密码算法,使用长度可变的秘钥 不可逆,既能用于数据加密,也可以应用于数字签名 RSA非对称加密内容长度有限制,1024位key的最多只能加密127位数据
MD5 非对称加密算法。全程:Message-Digest Algorithm,翻译为消息摘要算法 不可逆,压缩性,不容易修改,容易计算 穷举法可以破解

加密文件

集成

AndroidStudio的Module中build.gradle添加SQLCipher的依赖

compile 'net.zetetic:android-database-sqlcipher:3.5.7'

GreenDao加密

GreenDao有加密的接口,使用非常方便,在GreenDao初始化的时候启动加密模式。

  • 非加密模式

    DaoMaster.OpenHelper.getWritableDatabase()
  • 加密模式

    DaoMaster.OpenHelper.getEncryptedWritableDb(key)
    DaoMaster.OpenHelper encryptedHelper = new DaoMaster.DevOpenHelper(this, VOD_DB, null);
    // 选用设备唯一码作为加密的key
    DaoSession encryptedDaoSession = new DaoMaster(encryptedHelper.getEncryptedWritableDb(getUniquePseudoID())).newSession();

注意

  • 读取数据库时,key需要保存一致,否则,读出的数据为空
  • 增删改查的数据库操作加密非加密模式下都是一样的。

SQLiteOpenHelper加密

使用SQLiteOpenHelper自己定义的接口

  • 初始化SQLiteOpenHelper时,加载so库

    public class DBCipherHelper extends SQLiteOpenHelper {
    	public DBCipherHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
            //不可忽略的 进行so库加载
            SQLiteDatabase.loadLibs(context);
        }
    }
  • 使用

    • 传统模式

      //获取可写数据库
      SQLiteDatabase db = dbHelper.getWritableDatabase();
      //获取可读数据库
      SQLiteDatabase db = dbHelper.getReadableDatabase();
    • 加密模式

      //获取写数据库
      SQLiteDatabase db = dbHelper.getWritableDatabase(key);
      //获取可读数据库
      SQLiteDatabase db = dbHelper.getReadableDatabase(key);

加密方案总结

  • 加密内容后,将数据库打开,查询,可以看到加密后的内容,即密文。
  • 加密文件,集成SQLCipher后,数据库文件.db是完全加密的,因此,通过命令查询等操作数据库,会被提示数据库加密,操作失败!
  • 根据不同需求,使用加密文件或者加密内容的方式进行数据的安全保护,SQLCipher会增加apk的大小。