Android App数据加密
一、App数据加密概述:
App数据加密从哪些方面去考虑呢?以及为什么要加密呢?
1.1、网络传输加密
网络传输是不安全的,基于http 协议传输的内容是很容易被抓包提取数据。
1.2、跨进程intent 携带的数据加密
跨进程的传递的intent的数据,也是不安全的。比如sendBroadcast广播,携带的数据都是不安全的。
1.3、SharedPreference加密
SharedPreference存储起来其实就是一个xml文件,虽然默认或可设置Mode为Private,但基于沙箱保护的文件,虽然手机被root过了,是可以拿到的。也是不安全的。需要对文件内容进行加密。
1.4、Sqlite数据库加密
SQLite数据库与SharedPreference类似是被以.db的文件存储起来的。若被root后,也是很容易的被拿到的。
1.5、普通文件File加密
普通文件的存储要不放在App内存(此处内存指放在/data/data/app包名/xxx下)要不放在SDCard,放在SDCard不需root也可以拿到。放在App内存若被root当然也不安全了。
1.6、程序中加密的需求
SDK插件或AIDL组件提供给第三方app数据,组件或插件提供的数据不做处理也是不安全的。若攻击者下载SDK或接AIDL组件规范的调用,可以直接获取相关的数据值。
二、App数据加密方法
说到加密不得不提到加密方式及加密算法,加密方式上:一般有对称加密与非对称加密。这两者的区别是看是否使用同一个密钥。加密算法上,主要有DES、3DES、AES、RSA等。
2.1、网络传输加密
一般是使用https ssl协议,通过CA证书或自签名证书进行认证验证。若是CA认证的证书基本上是不用做处理,google默认实现的htttspurlconnection通过查找操作系统默认信任的证书即可达到验证信任的过程。当然若想更安全点的做法是 SSL pinning 限定受信SSL的范围。通过只信任你所访问的服务端所使用CA厂商颁布的CA证书链。
当然若使用是自签名的证书,首先需要生成服务端的公私钥证书,然后把证书添加到truststore中,在程序把truststore加载到app中去。实现X509TrustManager使用加载到app中的公钥对服务端做checkServerTrusted认证。最后使用https协议传输数据时,就都是加密后的数据了。
关于https ssl加密的过程可以通过下面的图来理解:
https ssl加密会话过程
整个过程使用非对称与对称加密,由于非对称加密性能比较低,只在第一握手时,如步骤2中,服务端响应传公钥证书给客户端后,客户端做公钥证书做验证。验证通过后将产生随机数,使用公钥加密随机数传给服务端。最后客户端与服务端都使用此随机数进行对称加密了。
2.2、跨进程intent 携带的数据加密
一般使用对称加密方式即可,比如通过AES加密,可以使用特定的Seed 生成256的密钥然后进行加密。解密的进程使用同一个Seed生成密钥然后进行解密数据。
2.3、SharedPreference加密
一般也是使用对称加密方式用AES,这里可以使用更安全的AES/CBC/PKCS5Padding方式,使用特定的随机的盐salt与初始化向量IV。不过这个盐与初始化向量都需要存储起来,保证解密也是使用它们来生成密钥与解密。
一种开源项目Secure-Preference对SharedPreference进行了封装,并实现了SharedPreferences接口,内部实现会使用AES对称加密对键Key与值Value都进行加密,加密后再进行base64写入到XML文件中。
Secure-Preference下载地址:https://github.com/scottyab/secure-preferences
另一个开源项目是cwac-prefs,也实现了对sharedpreferences接口并加密。不得不说老外这块就是走到国内前面啊…
2.4、Sqlite数据库加密
基本的原理与SharedPreference加密是相类似的,也是通过使用AES加密。若自己的实现的话,一般只对表中的值进行AES加密,由于有了数据库那么密钥生成的规则及加密规则可以自己玩,比如随机生成salt或iv,自己维护一个salt、iv表。这样可以达到每次插入的数据,加密的规则都是不一样的。(salt、iv不一样,表中插入一条salt iv表的id)
当然加密版Sqlite数据库也是有优秀的开源项目,SQLCipher是实现安全数据库存储的最简单方式之一,兼容Android 2.1+设置,这个当然没什么问题了吧。目前根据友盟的数据统计 2.3以下的活跃设备都只有4%以下了。且它使用的是256位的AES加密算法,对数据库中的每一页以CBC模式进行加密。当然也有一个小缺点,就是加入想着的依赖库了会使APK大上7M左右,这个也可能是它的唯一的缺点吧。
Android 版SQLCipher下载地址:https://github.com/sqlcipher/android-database-sqlcipher
2.5、普通文件File加密
文件的加密,个人理解,可以借鉴压缩算法,既可以减少文件存储占用的空间大小又可以实现加密安全。当然安全压缩的算法得达到一定的安全性。一般来说压缩其实类似proguard混淆,通过将相同数据片段,以一个简洁数据替换,并维护原始数据片段与简洁数据的表。当然这种加密方式不是特别安全。
没错你猜对了,文件加密也是有优势开源的项目。IOCipher,看名字大概猜出来这货是实现了Java.io API了。这意味着你基本上不用怎么改代码了,直接把原来import java.io.xxx的改成import info.guardianproject.iocipher.xxx就可以了。
IOCipher其实是SQLCipher的兄弟,它们同属于Guardian项目。它使用程序猿员透明的进行加解密文件。Oh,my god,不得不赞下,好强大啊。
IOCipher 下载地址:https://github.com/guardianproject/iocipher
2.6、程序中加密的需求
很类似与跨进程intent 携带的数据加密。若你开的程序需要给三方app,提供相应的数据,是通过AIDL或Messager等IPC形式,又或者是提供了SDK组件,向三方app提供数据时,最好通过AES加密。加密与解密的使用的随机Seed或Salt iv需要统一约定好。使用同一套即可。
附
Secure-Preference下载地址:https://github.com/scottyab/secure-preferences
Android 版SQLCipher下载地址:https://github.com/sqlcipher/android-database-sqlcipher
IOCipher 下载地址:https://github.com/guardianproject/iocipher
ps:转载 请注明出处:http://blog.csdn.net/chenshufei2/article/details/48263823 谢谢。