android sqlcipher 加密,Android 数据库加密 SQLCipher使用方法
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使用方法相关推荐
- laravel mysql 锁表_Laravel 数据库加密及数据库表前缀配置方法
报错问题:DecryptException in Encrypter.php line 148: The MAC is invalid. 如何运行 php artisan key:generate 这 ...
- android sqlcipher github,Android应用开发Android 数据库加密 SQLCipher使用方法
Android 数据库加密 SQLCipher使用方法 最近在做数据库加密,遇到了些问题,特此记录 greendao 支持数据库加密 网址https://greenrobot.org/greendao ...
- android sqlite加密数据库,Android Sqlite数据库加密
Android使用的是开源的SQLite数据库,数据库本身没有加密,加密思路通常有两个: 1. 对几个关键的字段使用加密算法,再存入数据库 2. 对整个数据库进行加密 SQLite数据库加密工具: 收 ...
- android sqlite数据库加密,(转)SQLite数据库的加密
1.创建空的SQLite数据库. //数据库名的后缀你可以直接指定,甚至没有后缀都可以 //方法一:创建一个空sqlite数据库,用IO的方式 FileStream fs = File.Create( ...
- 关于数据库加密你不能不知道的秘密
数据库是所有信息系统的核心,数据库的安全通常是指其中所存数据的安全,是网络安全.信息安全的重要组成部分.而对数据库中数据的加密保护,是数据库安全的重要内容.但是数据库加密具有相对较高的技术门槛,对于广 ...
- 加密机与数据库加密产品的区别?
加密机就像钥匙和锁,一般只用在整体入口处,对于细节部分的加密就不容易做.数据库加密则可以保证更细粒度的区分权限进行加密,还能保证应用加密的可维护性.加密机是做不到的 加密机可以提供密钥服务和加解 ...
- 超简单数据库加密防止数据泄露
数据泄露和暴露如今已非常普遍,很难跟踪所有的泄露事件,更难有时间仔细考虑周全的解决方案.但或许是出于必要性考虑,数据库巨头 MongoDB 花费两年时间开发出一套全新的数据库加密机制,直接指向减少这些 ...
- android数据库文件是否加密存储,详解Android数据存储之SQLCipher数据库加密
前言: 最近研究了Android Sqlite数据库以及ContentProvider程序间数据共享,我们清晰的知道Sqlite数据库默认存放位置data/data/pakage/database目录 ...
- Android studio+SQLCipher加密SQLite数据库的几个坑
Android studio SQLCipher加密SQLite数据库的几个坑 前言:Android 自带的SQLite数据库可以用于数据存储,但是,大家都知道其数据是存储于手机的data/data/ ...
最新文章
- 一道面试题:用多种方法实现两个数的交换
- 视频图像处理基础知识4(视频分辨率参考 行频 隔行扫描 逐行扫描)【转】
- jQuery的延迟对象
- 分布式锁双重防死锁演进
- Linux(CentOS 6.5)下配置Mono和Jexus并且部署ASP.NET MVC5
- AndroidStudio安卓原生开发_UI高级_DrawerLayout_侧滑菜单控件---Android原生开发工作笔记120
- java清除运行窗口内容,Java实现软件运行时启动信息窗口的方法
- Intellij idea控制台中文乱码问题
- AtomicStampedReference解决CAS的ABA问题
- 安全SaaS调查品牌认知
- CentOS 6.5 x64安装svn
- oauth2授权码模式——微信第三方登录原理
- 2018年注册测绘师考试详情解析
- php自动填表单,网页自动填表基础教程从简单开始
- php怎么将农历转换成公历,php 公历农历如何实现转换
- 不那么完美的 RSS 订阅方案 — feedly + RSSHub Radar
- oracle学习入门系列之五内存结构、数据库结构、进程
- TVP5147调试经验
- WebViewJavascriptBridge
- 极值点、驻点、鞍点、拐点
热门文章
- TensorFlow——tf.contrib.layers库中的相关API
- 使用VS Code开发asp.net core (上)
- python 发包爬取中国移动充值页面---可判断手机号是否异常
- SQL Server 数据库中的几个常见的临界值
- 解决android帮助文档打开慢
- java两种不同单例模式_关于Java里的两种单例模式
- 人类一败涂地电脑版_【天翼云盘】侠盗猎车手5(GTA5) 终极SVIP整合版,话不多说来波狠的!...
- 2017年12月计算机一级c,2017年12月计算机二级《C语言》强化模拟题(1)
- sae java 开发环境_新浪开放平台 sae环境 java主机使用感受
- java jdbc 传参_java – 将参数传递给JDBC PreparedStatement