微信本来作为一个社交的工具因为吸引了众多的用户被加入了越来越多的功能,有些功能比如支付之类的需要有更高的安全保障。
如何保证数据的安全呢? 从数据存放的位置来看,有些数据可以放在移动端,有些放在服务端。
数据在服务端
传统的C/S, B/S结构的应用的数据基本都在服务端,所以对保证数据的安全已经有很多成熟的方案,比如在数据传输的过程中采用安全的连接(SSL), 本地的数据基本在数据库里,保护数据库的数据不外泄,安全要求很高的话也可以加密数据库的数据。
数据在移动端
Android里在移动端存储数据用到的最多的方式是利用SQLite数据库,但是目前Android里的SQLite并没有加密的功能,所以要保护数据只有在应用端实现,但是应用端实现加密的话会对应用的性能产生不小的影响。主要有以下几个方面:
1. 应用端产生的数据需要进行多次的加解密操作;
2.应用端产生的加密的数据会使得原先建立的索引失效;
看看微信怎么弄的
先看看微信用到的SQL语句的执行时间,如何获取App里用到的SQL语句运行的时间呢?
1. 需要1个运行debug版本的设备或者root过的设备(用虚拟机就可以)
2. 将慢查询的时间设置为0,这样所有运行的SQL语句就会在logcat里显示出来
adb shell setprop db.log.slow_query_threshold 0
我在虚拟机上安装了一个微信,按照上面的方法设置之后并没有看出有语句打印出来,这就奇怪了,难道微信没有使用SQLite吗?
我看了下目录 [/data/data/com.tencent.mm/MicroMsg/24aebefd1208a86b21d57e48ddbaa25c], 下面确实是有很多SQLite格式的db文件。
所以这个时候第一个想法就是微信可能没有直接使用android framework层提供的操作SQLite的API, 下面反汇编一下微信apk看看。
可以看到微信App的源码大部分被混淆了,但是一个叫kingkong的目录下面代码的名字并没有被混淆,这里的代码和Android源码frameworks/base/core/java/android/database一样(事实上应该是被更改了,导致了SQL语句运行的信息也没被打印出来)。
可以猜测的是微信绕过framework层的API目的是这里的native的SQLite源码是支持加密功能的,这一点可以从/data/data/com.tencent.mm/MicroMsg/24aebefd1208a86b21d57e48ddbaa25c目录下的EnMicroMsg.db看出。
[email protected]:/data/data/com.tencent.mm/MicroMsg/24aebefd1208a86b21d57e48ddbaa25c # sqlite3 EnMicroMsg.db sqlite3 EnMicroMsg.db SQLite version 3.7.11 2012-03-20 11:35:50 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .tables .tables Error: file is encrypted or is not a database sqlite>
我使用.tables命令想看下数据库的表信息,得到数据库是加密的提示,EnMicroMsg.db这个db的名字的前缀En应该就是encryption的头两个字母。
关于SQLite的加密版本看看这个网址:-) https://www.zetetic.net/sqlcipher/open-source/