如何对sqlite3内存数据库数据库进行加密

本文标签:,
您可能还会对这些文章感兴趣!
》热门文章
》最新文章
》文章归档加密你的SQLite
关于SQLite SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的在读写效率、消耗总量、延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS、Android)。
关于SQLite
SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的在读写效率、消耗总量、延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS、Android)。
然而免费版的SQLite有一个致命缺点:不支持加密。这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到。比如国内某团购iOS客户端的DB缓存数据就一览无余:&
SQLite加密方式
对数据库加密的思路有两种:
1. 将内容加密后再写入数据库
这种方式使用简单,在入库/出库只需要将字段做对应的加解密操作即可,一定程度上解决了将数据赤裸裸暴露的问题。
不过这种方式并不是彻底的加密,因为数据库的表结构等信息还是能被查看到。另外写入数据库的内容加密后,搜索也是个问题。
2. 对数据库文件加密
将整个数据库整个文件加密,这种方式基本上能解决数据库的信息安全问题。目前已有的SQLite加密基本都是通过这种方式实现的。
SQLite加密工具
目前网上查询到iOS平台可用的SQLite加密工具有以下几种:
事实上SQLite有加解密接口,只是免费版本没有实现而已。而SQLite Encryption Extension (SEE)是SQLite的加密版本,提供以下加密方式:
RC4&AES-128&in&OFB&mode&AES-128&in&CCM&mode&AES-256&in&OFB&mode&
SQLite Encryption Extension (SEE)版本是收费的。
使用AES加密,其原理是实现了开源免费版SQLite没有实现的加密相关接口。
SQLiteEncrypt是收费的。
使用256-bit AES加密,其原理和一样,都是实现了SQLite的加密相关接口。
SQLiteCrypt也是收费的。
首先需要说明的是,SQLCipher是完全开源的,代码托管在上。
SQLCipher使用256-bit AES加密,由于其基于免费版的SQLite,主要的加密接口和SQLite是相同的,但也增加了一些自己的接口,详情见。
SQLCipher分为收费版本和免费版本,官网介绍的区别为:
asier to setup, saving many steps in project configuration
pre-built with a modern version of OpenSSL, avoiding another external dependency
much faster for each build cycle because the library doesn't need to be built from scratch on each compile (build time can be up to 95% faster with the static libraries)
只是集成起来更简单,不用再添加OpenSSL依赖库,而且编译速度更快,从功能上来说没有任何区别。仅仅为了上述一点便利去花费几百美刀,对于我等苦逼RD来说太不值了,还好有一个免费版本。
鉴于上述SQLite加密工具中,只有SQLCiper有免费版本,下面将将着重介绍下SQLCiper。
在项目中使用SQLCipher
在项目中集成免费版的SQLCipher略显复杂,还好官网以图文的方式介绍的非常详细,集成过程请参考。
使用SQLCipher初始化数据库
下面这段代码来自官网,其作用是使用SQLCipher创建一个新的加密数据库,或者打开一个使用SQLCipher创建的数据库。
NSString&*databasePath&=&[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,&NSUserDomainMask,&YES)&objectAtIndex:0]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&stringByAppendingPathComponent:&@&cipher.db&];&&&&&sqlite3&*&&&&&if&(sqlite3_open([databasePath&UTF8String],&&db)&==&SQLITE_OK)&{&&&&&&&&&const&char*&key&=&[@&BIGSecret&&UTF8String];&&&&&&&&&sqlite3_key(db,&key,&strlen(key));&&&&&&&&&int&result&=&sqlite3_exec(db,&(const&char*)&&SELECT&count(*)&FROM&sqlite_&,&NULL,&NULL,&NULL);&&&&&&&&&if&(result&==&SQLITE_OK)&{&&&&&&&&&&&&&NSLog(@&password&is&correct,&or,&database&has&been&initialized&);&&&&&&&&&}&else&{&&&&&&&&&&&&&NSLog(@&incorrect&password!&errCode:%d&,result);&&&&&&&&&}&&&&&&&&&&&&&&&&&&sqlite3_close(db);&&&&&}&
需要注意的是,在使用sqlite3_open打开或创建一个数据库,在对数据库做任何其它操作之前,都必须先使用sqlite3_key输入密码,否则会导致数据库操作失败,报出sqlite错误码SQLITE_NOTADB。
在sqlite3_open打开数据库成功,而且用sqlite3_key输入密码以后,就可以正常的对数据库进行增、删、改、查等操作了。
使用SQLCipher加密已存在的数据库
SQLCipher提供了sqlcipher_export()函数,该函数可以方便的对一个普通数据库导入到SQLCipher加密加密的数据库中,操作方式如下:
$&./sqlcipher&plaintext.db&&sqlite&&ATTACH&DATABASE&'encrypted.db'&AS&encrypted&KEY&'testkey';&&sqlite&&SELECT&sqlcipher_export('encrypted');&&sqlite&&DETACH&DATABASE&&&
解除使用SQLCipher加密的数据库密码
sqlcipher_export()函数同样可以将SQLCipher加密后的数据库内容导入到未加密的数据库中,从而实现解密,操作方式如下:
$&./sqlcipher&encrypted.db&&sqlite&&PRAGMA&key&=&'testkey';&&sqlite&&ATTACH&DATABASE&'plaintext.db'&AS&plaintext&KEY&'';&&--&empty&key&will&disable&encryption&sqlite&&SELECT&sqlcipher_export('plaintext');&&sqlite&&DETACH&DATABASE&&&
总体来说,SQLCipher是一个使用方便,灵活性高的数据库加密工具。
另外,我写了个工程放到了上,有需要的同学请自行下载。
CocoaChina是全球最大的苹果开发中文社区,官方微信每日定时推送各种精彩的研发教程资源和工具,介绍app推广营销经验,最新企业招聘和外包信息,以及Cocos2d引擎、Cocos Studio开发工具包的最新动态及培训信息。关注微信可以第一时间了解最新产品和服务动态,微信在手,天下我有!
请搜索微信号“CocoaChina”关注我们!
关注微信 每日推荐
扫一扫 浏览移动版& & MainActivity如下:& & [java]& & package cc.& & import net.sqlcipher.C& & import net.sqlcipher.database.SQLiteD& & import android.os.B& & import android.view.V& & import android.view.View.OnClickL& & import android.widget.B& & import android.app.A& & /**& & * Demo描述:& & * 使用SQLCipher对SQLite数据库进行加密& & *& & * 参考资料:& & * 1 http://blog.csdn.net/guolin_blog/article/details/& & * 2 http://blog.csdn.net/zhuawami/article/details/9038003& & *&Thank you very much& & */& & public class MainActivity extends Activity {& & private Button mAddB& & private Button mQueryB& & private SQLiteDatabase mSqLiteD& & private SQLCipherOpenHelper mSqlCipherOpenH& & private final String SECRET_KEY="";& & @Override& & protected void onCreate(Bundle savedInstanceState) {& & super.onCreate(savedInstanceState);& & setContentView(R.layout.main);& & initView();& & initDataBase();& & }& & private void initView(){& & mAddButton=(Button) findViewById(R.id.addButton);& & mAddButton.setOnClickListener(new ClickListenerImpl());& & mQueryButton=(Button) findViewById(R.id.queryButton);& & mQueryButton.setOnClickListener(new ClickListenerImpl());& & }& & private void initDataBase() {& & //加载libs/armeabi中的so& & SQLiteDatabase.loadLibs(this);& & //获取到SQLiteOpenHelper& & mSqlCipherOpenHelper=new SQLCipherOpenHelper(this);& & //设置打开数据库的密码SECRET_KEY& & mSqLiteDatabase = mSqlCipherOpenHelper.getWritableDatabase(SECRET_KEY);& & }& & private class ClickListenerImpl implements OnClickListener {& & private P& & @Override& & public void onClick(View v) {& & switch (v.getId()) {& & case R.id.addButton:& & for (int i = 0; i < 15; i++) {& & person = new Person("xiaoming" + i, "9527" + i);& & addData(person);& & }& && & case R.id.queryButton:& & person=queryData(8);& & System.out.println(""+person.toString());& && & default:& && & }& & }& & }& & public void addData(Person person) {& & mSqLiteDatabase.execSQL("insert into person (name,phone) values(?,?)",& & new Object[] {person.getName(), person.getPhone() });& & }& & public Person queryData(int id){& & Cursor cursor=mSqLiteDatabase.rawQuery("select * from person where personid=?",& & new String[]{String.valueOf(id)});& & while(cursor.moveToFirst()){& & int personid=cursor.getInt(cursor.getColumnIndex("personid"));& & String name=cursor.getString(cursor.getColumnIndex("name"));& & String phone=cursor.getString(cursor.getColumnIndex("phone"));& & return new Person(personid, name, phone);& & }& & cursor.close();& && & }& & }& & SQLCipherOpenHelper如下:& & [java]& & package cc.& & import android.content.C& & import net.sqlcipher.database.SQLiteD& & import net.sqlcipher.database.SQLiteOpenH& & /**& & * 注意:& & * 这里包的引用,均是在:& & * net.sqlcipher.database之下& & */& & public class SQLCipherOpenHelper extends SQLiteOpenHelper {& & private final static String DATABASE_NAME="test.db";& & public SQLCipherOpenHelper(Context context) {& & super(context, DATABASE_NAME, null, 1);& & }& & @Override& & public void onCreate(SQLiteDatabase db) {& & db.execSQL("create table person(personid integer primary key autoincrement,name varchar(20),phone VARCHAR(12))");& & }& & @Override& & public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {& & }& & }& & Person如下:& & [java]& & package cc.& & public class Person {& & private I& & private S& & private S& & public Person(String name, String phone) {& & this.name =& & this.phone =& & }& & public Person(Integer id, String name, String phone) {& & this.id =& & this.name =& & this.phone =& & }& & public Integer getId() {& && & }& & public void setId(Integer id) {& & this.id =& & }& & public String getName() {& && & }& & public void setName(String name) {& & this.name =& & }& & public String getPhone() {& && & }& & public void setPhone(String phone) {& & this.phone =& & }& & @Override& & public String toString() {& & return "Person [id=" + id + ", name=" + name + ", phone=" + phone + "]";& & }& & }& & main.xml如下:& & [html]& & <RelativeLayout xmlns:android="/apk/res/android"& & xmlns:tools="/tools"& & android:layout_width="match_parent"& & android:layout_height="match_parent"& & >& & <TextView& & android:layout_width="wrap_content"& & android:layout_height="wrap_content"& & android:text="使用SQLCipher对数据库进行加密"& & android:layout_centerHorizontal="true"& & />& & <Button& & android:id="@+id/addButton"& & android:layout_width="fill_parent"& & android:layout_height="wrap_content"& & android:text="添加数据"& & android:layout_marginTop="100dip"& & />& & <Button& & android:id="@+id/queryButton"& & android:layout_width="fill_parent"& & android:layout_height="wrap_content"& & android:text="查找数据"& & android:layout_marginTop="200dip"& & />& &
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
上一篇:下一篇:
相关经验教程
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.002 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益如何对sqlite3数据库进行加密_百度知道
如何对sqlite3数据库进行加密
Create(“c、创建空的sqlite数据库;&#92.db“)。2;/test.Open();cnn 、给未加密的数据库加密SQLiteConnection cnn = new SQLiteConnection(“Data Source=c;&#92:创建一个空sqlite数据库;/数据库名的后缀你可以直接指定.SetPassword(“password“);
SQLiteConnection cnn = new SQLiteConnection(“Data Source=c.Open();test2:&#92.db“;test.db“).db“);方法二:&#92、创建加密的空sqlite数据库&#47:&#92:&#92.ConnectionString);SQLiteConnection cnn = new SQLiteConnection(builder.db“).CreateFile(“c;方法一SQLiteConnection cnn = new SQLiteConnection(“Data Source=c;/方法二SQLiteConnectionStringBuilder builder = new SQLiteConnectionStringBuilder().Password = @”password“,即可轻松实现文件的加密;创建一个密码为password的空的sqlite数据库SQLiteConnection。//cnn,只要点击需要加密的文件的右键;方法一.Open();&#92.ChangePassword(“password“);创建的数据库是个0字节的文件.CreateFile(“c:&#92,甚至没有后缀都可以/ builder,用IO的方式FileStream fs = F//4;&#92.db“);cnn.db“);test2;&#92; SQLiteConnection cnn = new SQLiteConnection(“Data Source=D;&#92、打开加密sqlite数据库//test:&#92,您还可以使用专业的文件加密软件将SQLite数据库加密.ChangePassword(“password“)给SQLite数据库加密解密的方法.db“),输入密码即可轻松搞定;cnn:&#92;test2;3。 解密只要双击已加密文件;&#92。 超级加密3000使用起来;cnn,让你的加密数据无懈可击;&#47。 超级加密 3000采用先进的加密算法.DataSource = @”c,真正的达到超高的加密强度,使你的文件和文件夹加密后;除了用上述方法给SQLite数据库加密以外:&#92.Open();test2:用SQLiteConnectionSQLiteConnection:1
其他类似问题
为您推荐:
sqlite3的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 sqlite数据库加密工具 的文章

 

随机推荐