SQLCipher之攻与防

在移动端,不管是iOS还是Android,开发人员用的最多的本地数据库非SQlite莫属了。SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的在读写效率、消耗总量、延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案。

但是,用SQLite保存一些不是很敏感的信息还可以接受,存储敏感信息就值得商榷了,免费版的SQLite中的信息是明文存放的,你甚至直接用文本编辑器打开都可以看到敏感内容,比如下面这个:

其实SQLite是提供了加密功能的,即SQLite Encryption Extension (SEE),但是,要收费!还不便宜,2000刀。码农们穷啊,于是大家寻找免费的解决方案,最终SQLCipher成了比较理想的选择,因为它免费、开源,而其它家的SQLiteEncrypt、SQLiteCrypt等还是要收费。

SQLCipher也有收费版本,但收费版本只是在集成、依赖等易用性方面有优势,功能和免费差不多,因此免费版的SQLCipher成了Coder们的选择对象。

SQLCipher采用的是数据库文件整体加密的策略,使用256-bit AES加密,从算法角度来看是相当强悍了。于是,加密后的文件看起来及时这样了:

完全是天书嘛,ok,可以洗洗睡了。但真的就安全了吗?呵呵。

001 谋攻篇

密码学中有一句比较经典的话:一切秘密寓于密钥之中。只要我们拿到了密钥,剩下的问题都不是问题了。下面我们就来分析一下SQLCipher的密钥和加密过程。 根据官方的描述,SQLCipher是整体加密方案:

Transparent – An application doesn’t require any special knowledge of the underlying database security. Applications use the standard SQLite API to manipulate tables using SQL. Behind the scenes the library silently manages the security.

On-the-fly – SQLCipher encrypts and decrypts in chunks called pages, as needed, so it doesn’t operate on the database all at one time. This means SQLCipher starts up and closes down quickly performs very well even with very large databases works with SQLite indexing (i.e. retrieving a single record using an indexed search can incur as little as 5% overhead above a standard SQLite database)

它并不是对表或者列进行加密,也就是说他的数据库密钥只有一个,拿下这一个密钥就成。

SQLCipher在iOS上是这样用的:

1)在项目中加入sqlite3.h和sqlite3.m;

2)使用下面代码连接数据库:

其中的key就是我们需要的密钥!然后通过sqlite3_key函数将该key与数据库关联起来,接下来就可以执行sql语句操作了。程序员肯定觉得好用啊,就增加了两行语句就完成了加密功能,直接拷贝官方的代码到自己的工程中,把“StrongPassword”换成自己的密钥就成。真实容易啊,那么我攻击也很easy啦。

一般来说,对付这种程度的加密,只需要使用静态分析即可。对于iOS程序,将程序拖到ida中,找到sqlite3_key函数相关引用地址,顺藤摸瓜,基本就搞定了。下面就是某应用中定位该函数在setKey方法中,该方法是在它的数据open方法中调用的,可以看到已经明文硬编码了数据库的密码(图中抹红部分)。

拿到密码后有个偷懒的方法可以直接打开加密数据库:使用SQLiteManager,它支持SQLCipher加密的数据库,会提示输入数据库密码,不需要自己写程序了,而且浏览数据也很方便。

对于Android版的程序,如果没加壳的话,也是很好分析的。Android调用SQLCipher使用下面的方式:

openOrCreateDatabase方法的第二个参数就是密钥了。在jeb反编译出来的代码中寻找相关的方法就可以摸到相应的数据库密钥。

到这儿程序员可能要想了,我不硬编码看你咋整,我在代码中经过加减乘除、异或后在算出key,或者更狠一点用用户口令等进行动态解密变换,密钥就不会在程序中出现了。

但攻击者还有n多招数还没上场了,比如动态调试,在输入key的方法入口打断点,对key的明文进行拦截。 还有就是hook技术,对于Android上的应用,我们可以使用CydiaSubstrate,使用MS.hookClassLoad 方法将openOrCreateDatabase进行hook处理:

public class Main {

static void hookCryptoKey() {

MS.hookClassLoad("net.sqlcipher.database.SQLiteDatabase",

new MS.ClassLoadHook() {

public void classLoaded(Class arg0) {

Log.d("MyHook", "##### Class Loaded ");

Method openOrCreateDatabase;

try {

openOrCreateDatabase = arg0.getMethod(

"openOrCreateDatabase",

new Class[] { File.class, String.class, SQLiteDatabase.CursorFactory.class });

} catch (NoSuchMethodException e) {

openOrCreateDatabase = null;

Log.d("MyHook",

"##### Unable to find method ");

}

if (openOrCreateDatabase != null) {

Log.d("MyHook", "##### Found method ");

try {

final MS.MethodPointer old = new MS.MethodPointer();

MS.hookMethod(arg0,

openOrCreateDatabase,

new MS.MethodHook() {

public Object invoked(Object arg0,

Object... args)

throws Throwable {

Log.d("MyHook", "##### Error: " + Thread.currentThread().getStackTrace());

Log.d("MyHook",

"###### Method hooked, stealing key: " + args[1]);

return old.invoke(arg0, args);

}

}, old);

} catch (Exception e) {

System.out

.println("#### Unable to find class ");

}

}

}

});

}

static void initialize() {

hookCryptoKey();

}

}

这段代码可以将openOrCreateDatabase方法钩住并将第二个参数key在日志中打印出来,无视你前期经过了多少隐藏、变换。至于Substrate的用法这里就不细讲了,各位看官可以参考网上的资料。当然,你也可以尝试其它hook框架,如Xposed。

程序员可能不服气,我还可以上加壳,在iOS端我也可以上混淆、lua动态网上加载等手段啊?不过这貌似超出了SQLCipher攻防的地盘了,是程序本地保护的大范畴,有机会再研究。

002 防

写到这儿,其实对本地数据库加密是感到沮丧的,这完全就是把门锁和钥匙放在一起的做法嘛,不管你在本地上任何软的手段(硬件另说,如果你的密钥、算法都放在硬件中,比如USBKey中,安全性应该是有本质上的提升),不管是简单变换还是混淆、加壳、反调试、反hook,都难保不被攻击者破解掉,不过是或多或少延缓找到钥匙的时间罢了。

因此,建议除了以下情况,不要使用SQLCipher之类的本地数据库加密:

非敏感数据,爱咋用咋用

用户自己的数据,可以采用用户口令、指纹等方式直接或间接保护,因为这种情况下key其实是随用户走的,可以做到key和算法、数据的分离

其它情况推荐数据放在APP的服务端,将客户端做瘦,将安全的防护重点放在通信和服务端的防护上。

====================================分割线================================

本文转自d1net(转载)

时间: 2024-08-27 11:18:34

SQLCipher之攻与防的相关文章

一攻一防 DRM技术出现“破解标准”

数据保护技术DRM已经成为2007年发展最快的信息安全技术之一.近期,以微软为首的公司纷纷发布了相关技术的新标准.相反,在美国的黑客大会上,已经传出相应的破解标准,一攻一防对用户的影响不能小视. 新技术诞生 数据保护技术的诞生,就是针对互联网上的各种信息复制与数据安全而来.DRM以一定的安全算法实现对数字内容的保护,其具体的应用可以包括电子资料.视频.音频.图片.安全文档等数字内容的保护.DRM技术的工作原理是,首先建立信息授权中心,编码压缩后的数字内容利用密钥可以被加密保护,加密的信息头部存放

攻易防难 对付DDoS攻击需要更多合作

周二,Wells Fargo(富国银行)在线银行网站遭到了攻击,成为近期一系列针对银行攻击的最新中枪者,此前,摩根大通.美洲银行在上周就已遭到本轮攻击.虽然富国银行没有透露太多细节,但舆论普遍认定,它遭到的依然是分布式拒绝服务攻击(DDoS攻击).按照目前的技术发展趋势,DDoS攻击正在变得越来越容易,而防御却变得更难.因此,应对DDoS攻击,加强产业链间的合作势在必行. DDos进犯攻易防难 如今,DDoS进犯现已不需求高明的计算机技能,也不需求紧密的安排,越来越多的一般人参加进犯者部队中来.

智能家居网络安全攻与防

背景 物联网将会成为继互联网之后的下一个暴发点,目前以有不少公司已进入该领域. 智能家居作为物联网中最具有潜力的领域,网络安全是必须引起重视的课题.在互联网领域中,用户去安全性的敏感度并不是那个高.但是在智能家居领域中,如果系统被黑客攻击:半夜房门自动打开.无故解除安防系统.灯不亮等严重威胁到了用户的财产人身安全. 所以,智能家居想发展,安全性是决不可忽视的关键要素. 网络通信安全 任何信息在网络上传播能是能被第三者监听的. 一个局域网就像是一间会议室,里面坐了几个人,大家坐在一起相互交流.同时

攻与防的较量 信息化安全提升的源动力

本文讲的是攻与防的较量 信息化安全提升的源动力,信息化安全的提升,某种程度上,依赖于攻击与防护对抗的碰撞力度.攻击愈烈,防守意识愈能提升,安全防护的技术水平愈加速发展,和安全防御的能力愈不断提升;而防守越强,同时也反向刺激攻击手段不断"创新"与"求变". 本次社保行业信息泄露事件的集中报道,就是信息化安全攻与防较量的一个典型代表. 1.社保数据遭受泄露事件曝光绝不"纯属偶然" 7天连锁酒店的600万会员信息泄密; CSDN 1000多万客户信息被

在攻与防的博弈中寻求企业最佳防护实践

本文讲的是 :   在攻与防的博弈中寻求企业最佳防护实践 , [IT168 编译]黑帽子预算已经成为企业常见的防守策略,在这种方法中,企业试图提高攻击者的攻击成本来减少攻击.同时,攻击者也在试图让企业付出更沉重的代价来收集攻击情报:从域名生成到更微妙的代码混淆,攻击者利用各种技术来提高企业检测攻击.分析恶意软件和收集情报的成本. 在黑帽大会上,安全服务公司CrowdStrike的高级安全研究人员Jason Geffner将会对最新的恶意软件样本执行终端到终端分析,来演示攻击者为提高恶意软件分析和

和黑客在一起的365天论攻与防

3月27日至29日,云栖大会于深圳举行.本次深圳带来了"安全&出海"两大主题,在3月28日闭门分享沙龙会场上,游戏行业专家针对"全球同服"."阿里云数据库新特性"."大数据运营方案"."游戏安全保障"进行了深入沟通. 以下是虎钤讲师所做<和黑客在一起的365天论攻与防>分享的PPT截图: 扩展阅读 阿里云全球同服游戏解决方案 数据运营解决方案简述 玩转数据库新功能及应用-MySQL fo

网站生成静态页面攻略 -- 防采集策略

采集|策略|攻略|静态|页面 目前防采集的方法有很多种,先介绍一下常见防采集策略方法和它的弊端及采集对策: 一.判断一个IP在一定时间内对本站页面的访问次数,如果明显超过了正常人浏览速度,就拒绝此IP访问 弊端:1.此方法只适用于动态页面,如:asp\jsp\php等...静态页面无法判断某个IP一定时间访问本站页面的次数.2.此方法会严重影响搜索引擎蜘蛛对其收录,因为搜索引擎蜘蛛收录时,浏览速度都会比较快而且是多线程.此方法也会拒绝搜索引擎蜘蛛收录站内文件采集对策:只能放慢采集速度,或者不采建

网站生成静态页面攻略 -- 防采集而不防搜索引擎策略

采集|策略|攻略|静态|搜索引擎|页面 从前面的我讲的采集原理大家可以看出,绝大多数采集程序都是靠分析规则来进行采集的,如分析分页文件名规则.分析页面代码规则. 一.分页文件名规则防采集对策 大部分采集器都是靠分析分页文件名规则,进行批量.多页采集的.如果别人找不出你的分页文件的文件名规则,那么别人就无法对你的网站进行批量多页采集. 实现方法: 我认为用MD5加密分页文件名是一个比较好的方法,说到这里,有人会说,你用MD5加密分页文件名,别人根据此规则也可以模拟你的加密规则得到你的分页文件名.

大数据时代背景下网络安全的“攻”与“防”

刚买完房子,打开手机,装修类信息瞬间"刷屏":通过网站购买机票,旅游保险推销接踵而至--随着购物.网上支付.信息获取等日常生活的"互联网化",隐私安全侵权行为发生的频率日渐增加,公民个人信息"裸奔"似乎已成为常态. 6月1日起,<中华人民共和国网络安全法>(以下简称<网络安全法>)正式生效,<网络安全法>对网络诈骗.在关键信息基础设施的运行安全.建立网络安全监测预警与应急处置制度等方面都作出了明确规定. 但即使