在前几期中,我们介绍过Android应用开发过程中Shared Preference的实现,并演示了如何窃取安全防护不足的应用保存的Shared Preferences。本期中我们将学习如何使用一个名为”Secure Preferences”第三方库保护保存在Shared Preferences中的数据。尽管在设备被root的情况下,这个库也没法百分之百的保证应用的安全,但相比于普通的Shared Preferences敏感信息被能得到更好的保护。

安卓-12-使用第三方库加固Shared Preferences-JE2Se ' Blog

“Secure Preferences”是一个Shared preferences加密包装库,可以加密保存在XML文件里面的Shared Prefereces数据,并且是开源的。

本文会一步步教你如何在开发过程中使用“Secure Prefereces”库来保卫数据安全。

实战Android Secure Preferences

1、下载”Secure Prefereces”库,地址如下

2、在Eclipse中创建一个新工程。

3、在工程中添加我们刚刚下载的库以便待会用到。该过程类似于将其他库连接到我们的Android应用中去。如果你不知道怎么操作,简单的步骤就是:右击,选择属性,勾上“is Library”,然后将其连接的我们创建的应用中。

4、为了使用“Secure Prefereces”,我们需要在类中对Secure Prefereces进行初始化。

安卓-12-使用第三方库加固Shared Preferences-JE2Se ' Blog

5、现在我们就可以想使用普通的Shared Preferences一样,创建一个”Editor”对象来想XML中插入数据。

安卓-12-使用第三方库加固Shared Preferences-JE2Se ' Blog

如上图所示,我们一样使用Editor对象的putString方法来插入数据。

6、使用getString带上必要的参数来读取数据。

安卓-12-使用第三方库加固Shared Preferences-JE2Se ' Blog

上图中的代码读取了一个键值为”PASSWORD”的值,并显示在一个textview中。

这就是”Secure Preferences”在应用开发中的用法。

现在,我们会深入研究下”Secure Preferences”背后的工作,已经它是如何降低数据被窃取的风险的。

这里用到的APK和代码可以在上面的连接下载到。

我们为本文开发的应用的Activity布局中有一个编辑框,两个按钮,一个文本框,一个按钮用于加密并保存编辑框中的数据,另一个用于解密并在文本框中显示数据。如下图:

安卓-12-使用第三方库加固Shared Preferences-JE2Se ' Blog

当我们在输入框中输入数据并点击”encrypt and save”按钮的时候,上一届中第五步中的代码就会执行,加密并保存用户输入的数据:

安卓-12-使用第三方库加固Shared Preferences-JE2Se ' Blog

当我们点击”Decrypt and Display”按钮时,就会读取并解密保存在Shared Preferences中的数据。

现在,我们就来看看数据是怎么被存储到xml文件中的,以及为何可以增加窃密者窃取信息的难度。

前几期中,我们已经知道,Shared Prefercences 的数据保存在一个XML文件中,我们现在先吧这个文件下载到本地计算机中,可以使用如下命令:

adb pull /data/data/com.isi.secureprefs/shared_prefs/com.isi.secureprefs_preferences.xml

安卓-12-使用第三方库加固Shared Preferences-JE2Se ' Blog

可以使用cat命令查看文件的内容:

cat com.isi.secureprefs_preferences.xml

安卓-12-使用第三方库加固Shared Preferences-JE2Se ' Blog

如上图,可以看到,这个xml文件中确实保存了数据,但却是经过了加密的数据。

“SecurePreferences”如何工作?

安卓-12-使用第三方库加固Shared Preferences-JE2Se ' Blog

Secure Preferences 使用AES来加密数据。在Secure Preferences第一次被初始化的的时候回使用伪随机数来生成一个随机秘钥,并使用这个秘钥来加密保存的键值对,加密结果进过一遍base64后保存到XML文件中。因为AES是一种对此加密算法,所以解密也使用同一个秘钥。

总结

本文介绍了如何加密Shared Preferences中保存的键值对。这中办法能极大的提高设备中保存的数据的安全性。但当设备被root之后,这就不是那么理想了。更好的办法是使用基于密码的加密方式,及更加用户输入的密码来生成加密解密用的秘钥。

相关链接

https://github.com/scottyab/secure-preferences

Image Credit:

http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/256/Apps-preferences-desktop-cryptography-icon.png