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 加密,Android 数据库加密 SQLCipher使用方法相关推荐

  1. laravel mysql 锁表_Laravel 数据库加密及数据库表前缀配置方法

    报错问题:DecryptException in Encrypter.php line 148: The MAC is invalid. 如何运行 php artisan key:generate 这 ...

  2. android sqlcipher github,Android应用开发Android 数据库加密 SQLCipher使用方法

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

  3. android sqlite加密数据库,Android Sqlite数据库加密

    Android使用的是开源的SQLite数据库,数据库本身没有加密,加密思路通常有两个: 1. 对几个关键的字段使用加密算法,再存入数据库 2. 对整个数据库进行加密 SQLite数据库加密工具: 收 ...

  4. android sqlite数据库加密,(转)SQLite数据库的加密

    1.创建空的SQLite数据库. //数据库名的后缀你可以直接指定,甚至没有后缀都可以 //方法一:创建一个空sqlite数据库,用IO的方式 FileStream fs = File.Create( ...

  5. 关于数据库加密你不能不知道的秘密

    数据库是所有信息系统的核心,数据库的安全通常是指其中所存数据的安全,是网络安全.信息安全的重要组成部分.而对数据库中数据的加密保护,是数据库安全的重要内容.但是数据库加密具有相对较高的技术门槛,对于广 ...

  6. 加密机与数据库加密产品的区别?

    加密机就像钥匙和锁,一般只用在整体入口处,对于细节部分的加密就不容易做.数据库加密则可以保证更细粒度的区分权限进行加密,还能保证应用加密的可维护性.加密机是做不到的 加密机可‎以提供密‎钥服务和加解‎ ...

  7. 超简单数据库加密防止数据泄露

    数据泄露和暴露如今已非常普遍,很难跟踪所有的泄露事件,更难有时间仔细考虑周全的解决方案.但或许是出于必要性考虑,数据库巨头 MongoDB 花费两年时间开发出一套全新的数据库加密机制,直接指向减少这些 ...

  8. android数据库文件是否加密存储,详解Android数据存储之SQLCipher数据库加密

    前言: 最近研究了Android Sqlite数据库以及ContentProvider程序间数据共享,我们清晰的知道Sqlite数据库默认存放位置data/data/pakage/database目录 ...

  9. Android studio+SQLCipher加密SQLite数据库的几个坑

    Android studio SQLCipher加密SQLite数据库的几个坑 前言:Android 自带的SQLite数据库可以用于数据存储,但是,大家都知道其数据是存储于手机的data/data/ ...

最新文章

  1. 一道面试题:用多种方法实现两个数的交换
  2. 视频图像处理基础知识4(视频分辨率参考 行频 隔行扫描 逐行扫描)【转】
  3. jQuery的延迟对象
  4. 分布式锁双重防死锁演进
  5. Linux(CentOS 6.5)下配置Mono和Jexus并且部署ASP.NET MVC5
  6. AndroidStudio安卓原生开发_UI高级_DrawerLayout_侧滑菜单控件---Android原生开发工作笔记120
  7. java清除运行窗口内容,Java实现软件运行时启动信息窗口的方法
  8. Intellij idea控制台中文乱码问题
  9. AtomicStampedReference解决CAS的ABA问题
  10. 安全SaaS调查品牌认知
  11. CentOS 6.5 x64安装svn
  12. oauth2授权码模式——微信第三方登录原理
  13. 2018年注册测绘师考试详情解析
  14. php自动填表单,网页自动填表基础教程从简单开始
  15. php怎么将农历转换成公历,php 公历农历如何实现转换
  16. 不那么完美的 RSS 订阅方案 — feedly + RSSHub Radar
  17. oracle学习入门系列之五内存结构、数据库结构、进程
  18. TVP5147调试经验
  19. WebViewJavascriptBridge
  20. 极值点、驻点、鞍点、拐点

热门文章

  1. TensorFlow——tf.contrib.layers库中的相关API
  2. 使用VS Code开发asp.net core (上)
  3. python 发包爬取中国移动充值页面---可判断手机号是否异常
  4. SQL Server 数据库中的几个常见的临界值
  5. 解决android帮助文档打开慢
  6. java两种不同单例模式_关于Java里的两种单例模式
  7. 人类一败涂地电脑版_【天翼云盘】侠盗猎车手5(GTA5) 终极SVIP整合版,话不多说来波狠的!...
  8. 2017年12月计算机一级c,2017年12月计算机二级《C语言》强化模拟题(1)
  9. sae java 开发环境_新浪开放平台 sae环境 java主机使用感受
  10. java jdbc 传参_java – 将参数传递给JDBC PreparedStatement