- 浏览: 2204616 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1240)
- mac/IOS (287)
- flutter (1)
- J2EE (115)
- android基础知识 (582)
- android中级知识 (55)
- android组件(Widget)开发 (18)
- android 错误 (21)
- javascript (18)
- linux (70)
- 树莓派 (18)
- gwt/gxt (1)
- 工具(IDE)/包(jar) (18)
- web前端 (17)
- java 算法 (8)
- 其它 (5)
- chrome (7)
- 数据库 (8)
- 经济/金融 (0)
- english (2)
- HTML5 (7)
- 网络安全 (14)
- 设计欣赏/设计窗 (8)
- 汇编/C (8)
- 工具类 (4)
- 游戏 (5)
- 开发频道 (5)
- Android OpenGL (1)
- 科学 (4)
- 运维 (0)
- 好东西 (6)
- 美食 (1)
最新评论
-
liangzai_cool:
请教一下,文中,shell、C、Python三种方式控制led ...
树莓派 - MAX7219 -
jiazimo:
...
Kafka源码分析-序列5 -Producer -RecordAccumulator队列分析 -
hp321:
Windows该命令是不是需要安装什么软件才可以?我试过不行( ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
hp321:
Chenzh_758 写道其实直接用一下代码就可以解决了:JP ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
huanghonhpeng:
大哥你真强什么都会,研究研究。。。。小弟在这里学到了很多知识。 ...
android 浏览器
我们都知道,Android系统内置了SQLite数据库,并且提供了一整套的API用于对数据库进行增删改查操作。数据库存储是我们经常会使用到的一种存储方式,相信大多数朋友对它的使用方法都已经比较熟悉了吧。在Android中,我们既可以使用原生的SQL语句来对数据进行操作,也可以使用Android API提供的CRUD方法来对数据库进行操作,两种方式各有特点,选择使用哪一种就全凭个人喜好了。
不过,使用SQLite来存储数据却存在着一个问题。因为大多数的Android手机都是Root过的,而Root过的手机都可以进入到/data/data/<package_name>/databases目录下面,在这里就可以查看到数据库中存储的所有数据。如果是一般的数据还好,但是当涉及到一些账号密码,或者聊天内容的时候,我们的程序就会面临严重的安全漏洞隐患。那么今天,就让我们一起研究一下如何借助SQLCipher来解决这个安全性问题。
SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,它主要是在SQLite的基础之上增加了数据加密功能,如果我们在项目中使用它来存储数据的话,就可以大大提高程序的安全性。SQLCipher支持很多种不同的平台,这里我们要学习的自然是Android中SQLCipher的用法了。
下面我们就开始吧,首先要把Android项目所依赖的SQLCipher工具包下载下来,下载地址是:
https://s3.amazonaws.com/sqlcipher/SQLCipher+for+Android+v2.2.2.zip
接着解压这个工具包,会看到里面有assets和libs这两个目录,稍后需要将这两个目录中的内容添加到Android项目当中。那么现在我们就来新建一个Android项目,项目名就叫SQLCipherTest。
观察SQLCipherTest的项目结构,发现里面也分别有一个assets目录和一个libs目录,那么现在就可以把SQLCipher工具包中这两个目录里的内容复制过来。并不需要复制全部文件,选择必要的文件进行复制就可以了,完成以后项目结构图如下所示,图中显示的文件都是必要的。
到这里准备工作就全部完成了,接下来我们开始编写代码。首先创建一个MyDatabaseHelper继承自SQLiteOpenHelper,注意这里使用的并不是Android API中的SQLiteOpenHelper,而是net.sqlcipher.database包下的SQLiteOpenHelper,代码如下所示:
除了引入的包不一样了,其它的用法和传统的SQLiteOpenHelper都是完全相同的。可以看到,我们在onCreate()方法中创建了一张Book表,Book表里有name和pages这两个列。
接着,打开或新建activity_main.xml作为程序的主布局文件,代码如下所示:
这里只是简单地放置了两个按钮,分别用于添加和查询数据。接下来打开或新建MainActivity作为程序主Activity,代码如下所示:
可以看到,在onCreate()方法中首先调用了SQLiteDatabase的loadLibs()静态方法将SQLCipher所依赖的so库加载进来,注意这里使用的是net.sqlcipher.database包下的SQLiteDatabase。然后我们创建了MyDatabaseHelper的实例,并调用getWritableDatabase()方法去获取SQLiteDatabase对象。这里在调用getWritableDatabase()方法的时候传入了一个字符串参数,它就是SQLCipher所依赖的key,在对数据库进行加解密的时候SQLCipher都将使用这里指定的key。
在添加数据按钮的点击事件里面,我们通过ContentValues构建了一条数据,然后调用SQLiteDatabase的insert()方法将这条数据插入到Book表中。
在查询数据按钮的点击事件里面,我们调用SQLiteDatabase的query()方法来查询Book表中的数据,查询到的结果会存放在Cursor对象中,注意这里使用的是net.sqlcipher包下的Cursor。然后对Cursor对象进行遍历,并将查询到的结果打印出来。
现在运行一下程序,先点击添加数据按钮,再点击查询数据按钮,刚刚添加的那条数据就应该在控制台里打印出来了。
有没有感觉到使用SQLCipher提供的API和使用Android原生的数据库API,操作起来几乎是一模一样的。没错,SQLCipher对Android SDK中所有与数据库相关的API都制作了一份镜像,使得开发者可以像操作普遍的数据库文件一样来操作SQLCipher,而所有的数据加解密操作,SQLCipher都在背后帮我们处理好了。
话说写到这里,我们都一直还没体验一下SQLCipher加密后的效果呢,现在就来看一看吧,首先通过命令行的方式来访问demo.db这个数据库文件:
adb shell
cd /data/data/com.example.sqlciphertest/databases
sqlite3 -line demo.db
.table
尝试查看demo.db中的所有表,结果返回如下所示:
sqlite> .table
.table
Error: file is encrypted or is not a database
sqlite>
可以看出,当执行.table命令的时候被拒绝了,原因是数据库文件已加密。
除了使用命令行的方式,我们还可以尝试使用Root Explorer来打开数据库文件,结果如下图所示:
意料之中,果然打开失败了。这就足以说明,目前数据库中的数据是非常安全的,只有在应用程序里通过SQLCipher提供的API才可以访问到数据库里的数据,使用其它的方式都无法获取其数据。
需要提醒的一点是,项目中引入了SQLCipher之后,会让你的程序体积骤然增加,打成APK后大概会变大好几M,是更侧重于文件大小,还是更侧重于程序安全,你应该根据具体的需求做出合适的判断。
不过,使用SQLite来存储数据却存在着一个问题。因为大多数的Android手机都是Root过的,而Root过的手机都可以进入到/data/data/<package_name>/databases目录下面,在这里就可以查看到数据库中存储的所有数据。如果是一般的数据还好,但是当涉及到一些账号密码,或者聊天内容的时候,我们的程序就会面临严重的安全漏洞隐患。那么今天,就让我们一起研究一下如何借助SQLCipher来解决这个安全性问题。
SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,它主要是在SQLite的基础之上增加了数据加密功能,如果我们在项目中使用它来存储数据的话,就可以大大提高程序的安全性。SQLCipher支持很多种不同的平台,这里我们要学习的自然是Android中SQLCipher的用法了。
下面我们就开始吧,首先要把Android项目所依赖的SQLCipher工具包下载下来,下载地址是:
https://s3.amazonaws.com/sqlcipher/SQLCipher+for+Android+v2.2.2.zip
接着解压这个工具包,会看到里面有assets和libs这两个目录,稍后需要将这两个目录中的内容添加到Android项目当中。那么现在我们就来新建一个Android项目,项目名就叫SQLCipherTest。
观察SQLCipherTest的项目结构,发现里面也分别有一个assets目录和一个libs目录,那么现在就可以把SQLCipher工具包中这两个目录里的内容复制过来。并不需要复制全部文件,选择必要的文件进行复制就可以了,完成以后项目结构图如下所示,图中显示的文件都是必要的。
到这里准备工作就全部完成了,接下来我们开始编写代码。首先创建一个MyDatabaseHelper继承自SQLiteOpenHelper,注意这里使用的并不是Android API中的SQLiteOpenHelper,而是net.sqlcipher.database包下的SQLiteOpenHelper,代码如下所示:
import android.content.Context; import net.sqlcipher.database.SQLiteDatabase; import net.sqlcipher.database.SQLiteDatabase.CursorFactory; import net.sqlcipher.database.SQLiteOpenHelper; public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String CREATE_TABLE = "create table Book(name text, pages integer)"; public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { } }
除了引入的包不一样了,其它的用法和传统的SQLiteOpenHelper都是完全相同的。可以看到,我们在onCreate()方法中创建了一张Book表,Book表里有name和pages这两个列。
接着,打开或新建activity_main.xml作为程序的主布局文件,代码如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/add_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="添加数据" /> <Button android:id="@+id/query_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查询数据" /> </LinearLayout>
这里只是简单地放置了两个按钮,分别用于添加和查询数据。接下来打开或新建MainActivity作为程序主Activity,代码如下所示:
public class MainActivity extends Activity { private SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SQLiteDatabase.loadLibs(this); MyDatabaseHelper dbHelper = new MyDatabaseHelper(this, "demo.db", null, 1); db = dbHelper.getWritableDatabase("secret_key"); Button addData = (Button) findViewById(R.id.add_data); Button queryData = (Button) findViewById(R.id.query_data); addData.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { ContentValues values = new ContentValues(); values.put("name", "达芬奇密码"); values.put("pages", 566); db.insert("Book", null, values); } }); queryData.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Cursor cursor = db.query("Book", null, null, null, null, null, null); if (cursor != null) { while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); int pages = cursor.getInt(cursor.getColumnIndex("pages")); Log.d("TAG", "book name is " + name); Log.d("TAG", "book pages is " + pages); } } cursor.close(); } }); } }
可以看到,在onCreate()方法中首先调用了SQLiteDatabase的loadLibs()静态方法将SQLCipher所依赖的so库加载进来,注意这里使用的是net.sqlcipher.database包下的SQLiteDatabase。然后我们创建了MyDatabaseHelper的实例,并调用getWritableDatabase()方法去获取SQLiteDatabase对象。这里在调用getWritableDatabase()方法的时候传入了一个字符串参数,它就是SQLCipher所依赖的key,在对数据库进行加解密的时候SQLCipher都将使用这里指定的key。
在添加数据按钮的点击事件里面,我们通过ContentValues构建了一条数据,然后调用SQLiteDatabase的insert()方法将这条数据插入到Book表中。
在查询数据按钮的点击事件里面,我们调用SQLiteDatabase的query()方法来查询Book表中的数据,查询到的结果会存放在Cursor对象中,注意这里使用的是net.sqlcipher包下的Cursor。然后对Cursor对象进行遍历,并将查询到的结果打印出来。
现在运行一下程序,先点击添加数据按钮,再点击查询数据按钮,刚刚添加的那条数据就应该在控制台里打印出来了。
有没有感觉到使用SQLCipher提供的API和使用Android原生的数据库API,操作起来几乎是一模一样的。没错,SQLCipher对Android SDK中所有与数据库相关的API都制作了一份镜像,使得开发者可以像操作普遍的数据库文件一样来操作SQLCipher,而所有的数据加解密操作,SQLCipher都在背后帮我们处理好了。
话说写到这里,我们都一直还没体验一下SQLCipher加密后的效果呢,现在就来看一看吧,首先通过命令行的方式来访问demo.db这个数据库文件:
引用
adb shell
cd /data/data/com.example.sqlciphertest/databases
sqlite3 -line demo.db
.table
尝试查看demo.db中的所有表,结果返回如下所示:
引用
sqlite> .table
.table
Error: file is encrypted or is not a database
sqlite>
可以看出,当执行.table命令的时候被拒绝了,原因是数据库文件已加密。
除了使用命令行的方式,我们还可以尝试使用Root Explorer来打开数据库文件,结果如下图所示:
意料之中,果然打开失败了。这就足以说明,目前数据库中的数据是非常安全的,只有在应用程序里通过SQLCipher提供的API才可以访问到数据库里的数据,使用其它的方式都无法获取其数据。
需要提醒的一点是,项目中引入了SQLCipher之后,会让你的程序体积骤然增加,打成APK后大概会变大好几M,是更侧重于文件大小,还是更侧重于程序安全,你应该根据具体的需求做出合适的判断。
发表评论
-
带你深入理解 FLUTTER 中的字体“冷”知识
2020-08-10 23:40 635本篇将带你深入理解 Flutter 开发过程中关于字体和文 ... -
Flutter -自定义日历组件
2020-03-01 17:56 1111颜色文件和屏幕适配的文件 可以自己给定 import ... -
Dart高级(一)——泛型与Json To Bean
2020-02-23 19:13 1005从 Flutter 发布到现在, 越来越多人开始尝试使用 Da ... -
flutter loading、Progress进度条
2020-02-21 17:03 1181Flutter Progress 1 条形无固定值进度条 ... -
Flutter使用Https加载图片
2020-02-21 01:39 1020Flutter使用Https加载图片 使用http加载图片出 ... -
flutter shared_preferences 异步变同步
2020-02-21 00:55 848前言 引用 在开发原生iOS或Native应用时,一般有判断上 ... -
Flutter TextField边框颜色
2020-02-19 21:31 937监听要销毁 myController.dispose(); T ... -
flutter Future的正确用法
2020-02-18 21:55 808在flutter中经常会用到异步任务,dart中异步任务异步处 ... -
记一次Flutter简单粗暴处理HTTPS证书检验方法
2020-02-18 14:13 979最近在做Flutter项目到了遇到一个无解的事情,当使用Ima ... -
flutter 获取屏幕宽度高度 通知栏高度等屏幕信息
2019-07-27 08:39 1344##MediaQuery MediaQuery.of(con ... -
关于flutter RefreshIndicator扩展listview下拉刷新的问题
2019-07-10 19:40 1143当条目过少时listview某些嵌套情况下可能不会滚动(条目 ... -
flutter listview 改变状态的时候一直无限添加
2019-07-10 16:01 791setstate的时候会一直无限的调用listview.bui ... -
Flutter Android端启动白屏问题的解决
2019-07-09 00:51 1526问题描述 Flutter 应用在 Android 端上启动时 ... -
Flutter中SnackBar使用
2019-07-08 23:43 781底部弹出,然后在指定时间后消失。 注意: build(Bui ... -
Flutter 之点击空白区域收起键盘
2019-07-08 18:43 1792点击空白处取消TextField焦点这个需求是非常简单的,在学 ... -
Flutter 弹窗 Dialog ,AlertDialog,IOS风格
2019-07-08 18:04 1383import 'package:flutter/mate ... -
flutter ---TextField 之 输入类型、长度限制
2019-07-08 14:30 2337TextField想要实现输入类型、长度限制需要先引入impo ... -
【flutter 溢出BUG】键盘上显示bottom overflowed by 104 PIXELS
2019-07-08 11:13 1567一开始直接使用Scaffold布局,body:new Colu ... -
解决Flutter项目卡在Initializing gradle...界面的问题
2019-07-07 12:53 880Flutter最近很火,我抽出了一点时间对Flutter进行了 ... -
关于android O 上 NotificationChannel 的一些注意事项
2019-07-04 11:47 941最近在适配android O,遇到个问题,应用中原本有设置界面 ...
相关推荐
本文将详细介绍如何在Android应用中使用Sqlcipher对sqlite数据库进行加解密。 首先,你需要在你的项目中集成Sqlcipher库。通常,可以通过Gradle依赖管理来添加Sqlcipher的依赖。在你的app级别的build.gradle文件中...
SQLCipher的工作原理是通过使用AES(Advanced Encryption Standard)加密算法对SQLite数据库进行加解密。在应用层,用户可以设置一个密码,这个密码会被用来生成一个加密密钥。当数据库被打开时,必须提供正确的密码...
SqlCipher.exe是一款针对Sqlite数据库的加密查看工具,专...通过使用SqlCipher.exe,用户可以在Windows环境下轻松处理这些加密的数据库,进行查看和管理,从而在享受Sqlite带来的便利的同时,也得到了数据安全的保障。
Sqlcipher的工作原理是通过对SQLite的API进行拦截,然后在数据写入和读取时进行加密和解密。它使用了标准的AES(Advanced Encryption Standard)256位加密算法,这是一种国际上广泛认可的高强度加密技术。在Android...
# Android数据库安全解决方案:使用SQLCipher进行加解密 ## 一、背景介绍与问题提出 随着移动互联网的发展,智能手机已成为人们日常生活中不可或缺的一部分。在众多的移动操作系统中,Android以其开放性和灵活性受...
在Android应用开发中,SQLite是一个...通过以上介绍,我们了解了在Android中使用SQLCipher实现SQLite数据库加密的重要性、方法以及注意事项。在实际项目中,可以根据需求选择适合的加密策略,确保应用的数据安全性。
解密 android-database-sqlcipher:3.5.7生成的加密数据库文件,可拿来直接用,方法简单有效
由于数据安全性的重要性,有时我们需要对SQLite数据库进行加解密,以保护用户信息不被非法访问。本文将围绕"加解密Android数据库SQLite"这一主题,详细介绍如何实现这一功能。 首先,理解SQLite数据库的基本原理。...
SQLCipher的基本原理是对SQLite数据库进行透明加密,通过修改SQLite的C库,在数据读写时自动进行加解密操作。这样一来,即使数据库文件被盗取,没有密钥也无法访问其中的数据,大大提高了数据安全性。 在Android中...
SQLCipher则解决了SQLite的安全问题,它通过AES(高级加密标准)对数据库进行加密,确保即使数据库文件被窃取,也无法轻易读取其中的内容。这在处理敏感用户数据时显得尤为重要。但加密过程必然会对数据库操作性能...
在Android开发中,为了保护应用程序中的敏感数据,如用户信息、交易记录等,开发者常常需要对SQLite数据库进行加密。SQLCipher就是一款专为SQLite数据库提供加密功能的开源库,适用于Android和其他平台。本文将深入...
SqlCipher 在SQLite数据库的基础上添加了一层加密,通过使用AES(高级加密标准)算法来对数据进行加解密。当应用程序打开数据库时,SqlCipher会要求提供一个密钥,只有提供正确的密钥才能访问数据,从而防止未经...
通过以上讲解,你应该对如何在Android Studio 1.5.1项目中使用SqlCipher有了深入的理解,能够实现对SQLite数据库的加密操作,从而提升应用的安全性。在实际开发过程中,还需要根据具体需求和场景,灵活应用和调整...
SQLcipher的核心功能在于数据加密,它通过使用标准的AES(高级加密标准)算法,对SQLite数据库进行透明加密。当数据库被SQLcipher加密后,只有拥有正确密钥的用户才能访问数据,这极大地增强了数据的保密性。...
综上所述,SQLCipher for Android v3.5.6是一个为Android应用提供加密SQLite数据库的工具,适用于那些对数据隐私有严格要求的项目。通过正确使用和配置,开发者可以在保护用户数据的同时,维持应用的正常运行。
SqlCipher的核心在于将SQLite的原生API进行扩展,通过在数据库文件读写时加入加密/解密过程,使得数据在磁盘上以密文形式存在。其工作流程大致如下: 1. **初始化**:在数据库打开时,SqlCipher会要求提供一个密钥...
SQLCipher是一个开源项目,它的核心功能是对SQLite数据库的SQL查询进行加密,这样即使数据库文件被非法获取,没有正确的密钥也无法读取其中的内容。这大大增强了Android应用的数据安全性,尤其对于那些处理敏感用户...
本“sqlite数据加密demo程序”提供了一个完整的解决方案,帮助开发者了解并实现Android平台上SQLite数据库的加解密功能。 在Android应用开发中,SQLite数据库通常用于存储应用程序的数据。然而,这些数据以明文形式...