Android 数据库加密 SQLCipher使用方法

最近在做数据库加密,遇到了些问题,特此记录

greendao 支持数据库加密

网址https://greenrobot.org/greendao/documentation/database-encryption/

SQLCipher 网址:https://www.zetetic.net/sqlcipher/

SQLCipher 如何依赖在Android

网址:https://www.zetetic.net/sqlcipher/sqlcipher-for-android/

AS依赖 compile ‘net.zetetic:android-database-sqlcipher:3.5.9@aar’

每次在操作数据库前,初始化SQLCipher 所以我放在了Application下

SQLiteDatabase.loadLibs(APPApplication.this);

在操作数据库时与SQLiteDatabase 基本一样,唯一的区别就是打开数据库,需要密码 首先打开一个加密的数据库

sqlcipher 打开加密数据库

net.sqlcipher.database.SQLiteDatabase  sqLiteDatabase =   net.sqlcipher.database.SQLiteDatabase.openDatabase(file.getAbsolutePath(),   password, null,

SQLiteDatabase.OPEN_READWRITE

|   SQLiteDatabase.CREATE_IF_NECESSARY

|   SQLiteDatabase.NO_LOCALIZED_COLLATORS, new SQLiteDatabaseHook() {

@Override

public   void preKey(net.sqlcipher.database.SQLiteDatabase sqLiteDatabase) {

}

@Override

public   void postKey(net.sqlcipher.database.SQLiteDatabase sqLiteDatabase) {

//操作数据与 Android SQLiteDatabase 用法一致

}

});

//greendao 操作数据库时 用这个方法 打开加密的库

openHelper.getEncryptedWritableDb(Contents.DB_KEY);

openHelper.getEncryptedReadableDb(Contents.DB_KEY);

greendao 中结合 sqlcipher 用法:

/**

* 获取可读数据库

*/

private Database   getReadableDatabase() {

if (Contents.DB_RELEASE)   {

DBencrypt.getInstences().encrypt(UIUtil.getContext(),   Contents.DB_KEY);

return   openHelper.getEncryptedReadableDb(Contents.DB_KEY);

} else {

return   openHelper.getReadableDb();

}

}

/**

* 获取可写数据库

*/

private Database   getWritableDatabase() {

if (Contents.DB_RELEASE)   {

DBencrypt.getInstences().encrypt(UIUtil.getContext(), Contents.DB_KEY);

return   openHelper.getEncryptedWritableDb(Contents.DB_KEY);

} else {

return openHelper.getReadableDb();

}

}

做完后遇到一个尴尬的问题,第一次进去时确实能显示,没毛病,当把进程杀死后在进去,都报错。。。

net.sqlcipher.database.SQLiteException: file is not a database: , while   compiling: select count(*) from sqlite_master;

查询多次后发现 是加密 解密时出问题,当数据库原来未加密时用此方法打开,会报错。所以在查询数据之前,先把未加密的数据库加密,再去查询

代码附上:

/**

* 加密数据库

* Created by Han on   2018/4/10

*   Email:yin13753884368@163.com

*   CSDN:https://blog.csdn.net/yin13753884368/article

*   Github:https://github.com/yin13753884368

*/

public class DBencrypt {

public static DBencrypt   dBencrypt;

private Boolean isOpen =   true;

public static DBencrypt   getInstences() {

if (dBencrypt == null)   {

synchronized   (DBencrypt.class) {

if (dBencrypt ==   null) {

dBencrypt =   new DBencrypt();

}

}

}

return dBencrypt;

}

/**

* 如果有旧表 先加密数据库

*

* @param context

* @param passphrase

*/

public void encrypt(Context   context, String passphrase) {

File file = new   File(/data/data/ + context.getPackageName() + /databases/db_name);

if (file.exists())   {

if (isOpen) {

try {

File newFile   = File.createTempFile(sqlcipherutils, tmp, context.getCacheDir());

net.sqlcipher.database.SQLiteDatabase db =   net.sqlcipher.database.SQLiteDatabase.openDatabase(

file.getAbsolutePath(), , null, SQLiteDatabase.OPEN_READWRITE);

db.rawExecSQL(String.format(ATTACH DATABASE '%s' AS encrypted KEY   '%s';,

newFile.getAbsolutePath(), passphrase));

db.rawExecSQL(SELECT sqlcipher_export('encrypted'));

db.rawExecSQL(DETACH DATABASE encrypted;);

int version =   db.getVersion();

db.close();

db =   net.sqlcipher.database.SQLiteDatabase.openDatabase(newFile.getAbsolutePath(),

passphrase, null,

SQLiteDatabase.OPEN_READWRITE);

db.setVersion(version);

db.close();

file.delete();

newFile.renameTo(file);

isOpen =   false;

} catch   (Exception e) {

isOpen = false;

}

}

}

}

}

android sqlcipher github,Android应用开发Android 数据库加密 SQLCipher使用方法相关推荐

  1. android sqlcipher 加密,Android 数据库加密 SQLCipher使用方法

    android sqlcipher使用方法 最近在做数据库加密,遇到了些问题,特此记录 greendao 支持数据库加密 网址https://greenrobot.org/greendao/docum ...

  2. android+使用bmob冲突,bmob开发android遇到的问题

    昨天尝试使用bmob,但是在使用文件对象时候遇到问题,但是他们的工作人员周末没上班,问题没解决,昨晚一晚没睡好,之后大清早的来求帮助了. 源码如下: String path = Environment ...

  3. mac android手机调试,mac os开发android应用通过usb真机调试

    当前开发用的ari,sublime + webstrom 开发node.js还比较流畅,还没有出现被堵被坑的局面. 尝试开发android应用时,各种坑,其中一个比较深的坑就是今天要和大家分享的. m ...

  4. kotlin开发Android入门篇八Kotlin开发Android的基本使用

    基础篇:Kotlin开发Android的基本使用 使用AndroidStudio3.0及以上开发Kotlin在新建项目中勾选这个选项则会默认开发语言为Koltin,然后再gradle(Project的 ...

  5. Android仿支付宝UI功能开发,Android 自定义view仿支付宝咻一咻功能

    支付宝上有一个咻一咻的功能,就是点击图片后四周有水波纹的这种效果,今天也写一个类似的功能. 效果如下所示: 思路: 就是几个圆的半径不断在变大,这个可以使用动画缩放实现,还有透明动画 还有就是这是好几 ...

  6. eclipse android 第一个程序,Eclipse 开发 Android,第一个 HelloWord 程序(学习1)-Fun言

    名词解释: SDK:Software Development Kit AVD:Android Virtual Devices ADT:Android Development Tools 1. Inst ...

  7. Android系统(20)---开发android项目的常用jar包

    1. 百度地图 Armeabi/libBaiduMapSDK_v3_4_0_15.so, libBMapApiEngine.so baidumapapi_v3_4_9.jar(demo),locSDK ...

  8. go语言能编android程序吗,用 Golang 开发 Android 应用(二)—— 简单 UI-Go语言中文社区...

    计划按以下的内容更新 简单 UI 关于开发一个应用,要有自己的应用名(显示用),和包名(真正唯一的应用名),简单说一台 Android 手机中所有应用的包名是唯一的,如果新安装的应用包名和已安装的应用 ...

  9. Android仿支付宝UI功能开发,Android类似支付宝我的界面切片

    Android界面制作-类似支付宝我的界面,内含整个项目.效果图 内含以下栏目: 头像.姓名 账单.总资产.余额. 银行卡.保险服务.公益等 资源下载: 视频地址(优酷):http://v.youku ...

最新文章

  1. 非视线成像 - 把墙角变为相机
  2. 图灵11月书讯:大约在冬季
  3. html 如何实现一条竖线边上有 刻度_如何用低技术实现高性能
  4. checkbox的相关知识点
  5. vw实现移动端自适应页面
  6. spring security默认登录页面登录用户,和自定义数据源
  7. Altium Designer -- PCB布线面试题(转)
  8. 看美文,记单词(6)
  9. JavaScript 如何打败众语言,成为 Node 的实现语言?
  10. mysql 优化关键字_MySQL 优化之 EXPLAIN 关键字
  11. SQL Server 连接查询(内连接查询)
  12. TMEA:源于音乐,高于盛典
  13. SCAU华南农业大学-数电实验-用74LS138实现1位的全加器
  14. 基于linux平台的嵌入式开发每日一练(二)
  15. 常见路由器默认用户名和密码
  16. Tkinter模块GUI界面化编程实战(七)——人机对战五子棋(含超详解及完整源码、完整程序免费下载链接)
  17. 年终固定资产大盘点的具体步骤
  18. 医学影像管理系统源码(PACS) PACS源码 PACS系统源码
  19. Android ROM开发(一)——Windows下Cygwin和Android_Kitchen厨房的安装
  20. 费雪MOGAFX方程式是什么? -

热门文章

  1. ASP.NET给图片加水印
  2. 快应用的开发-新手入门指南
  3. 尚学堂JAVA第六章作业答案参考
  4. 推荐 :数据可视化专家的七个秘密
  5. html 没有单位的数据,计算机中最小的数据单位是什么
  6. 泛微Excel文件导出
  7. python中文文本分析_python简单的分析文本
  8. RapidIO协议概述(一)
  9. linux下用mpg123听音乐
  10. cookie清空Java_java清除及设置cookie代码