查看原文
其他

Android数据加密方案

2017-03-14 白痴狒狒 终端研发部
作者介绍

今天是周二,新的一天,新的心情!

本片讲解了Android数据加密方案的总结。来自于简书作者为的一篇投稿。这篇文章对数据AES加密进行一个简单的了解。希望能帮助到大家。

正文

1、混淆文件

这个比较简单,不知道如何混淆的,推荐

2、加固

APP上线之前最好做一下加固,常用的有:360加固宝,爱加密等

3、HTTPS

现在很多APP都用HTTPS作为网络传输的保证,防止中间人攻击,提高数据传输的安全性(用Retrofit的网络请求框架的,要加上HTTPS也不是什么难事,推荐 ,这里说的HTTPS是指自签的)

4、流程图

如果你没用HTTPS的话,为了确保传输安全,还需对传输的数据进行加密,这里我推荐用AES+RSA进行加密,(不知道这两种加密算法的自行百度一下,了解一下原理),我画了一张流程图:



具体过程:

  • 是先由服务器创建RSA密钥对

  • RSA公钥保存在安卓的so文件里面

  • 服务器保存RSA私钥。

  • 安卓创建AES密钥(这个密钥也是在so文件里面),并用该AES密钥加密待传送的明文数据,

  • 同时用接受的RSA公钥加密AES密钥,最后把用RSA公钥加密后的AES密钥同密文一起通过Internet传输发送到服务器。

  • 当服务器收到这个被加密的AES密钥和密文后,首先调用服务器保存的RSA私钥,并用该私钥解密加密的AES密钥,得到AES密钥。

  • 最后用该AES密钥解密密文得到明文。

5、so文件

ndk开发的so,可以存放一些重要的数据,如:密钥、私钥、API_KEy等,不过这里我建议大家使用分段存放,C层(so文件)+String文件(string.xml)+gradle文件,用的时候再拼接合并,还有如上图所示,AES的加密算法是放在C层进行实现的,这样也是最大程度保护我们数据的安全

Q:公钥传输是否有安全问题?(RSA key)

R:固定key,也就是保存在so文件中,理论上不会不安全,当然也可以动态从服务器获取,但传输不安全(前提不是https)

Q:AES key存储在哪里比较好?

R:分段存放,C层(so文件)+String文件(string.xml)+gradle文件;也可以从服务获取


以下是个人总结:


AES加密代码:


一个AES加密解密的测试用例:



SharedPreferencesDemo.java


效果
首先,在AVD我们可以看到如下界面,在两个控件上我们分别输入abc和123456。



接着,我们打开DDMS的File Explore可以看到在data->data->ni->shared_prefs下面产生了一个名字叫做MY_PREFERENCES.xml的文件,该文件就是用来存储我们刚才设置的账号和密码。 将其导出,并打开,可以看到如下内容:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?><map><string name="MY_ACCOUNT">abc</string><string name="MY_PASSWORD">04B75FAD36E907BE50CE3222B0052B79</string></map>

这说明我们可以成功将账号和加密后的密码保存下来了。 最后,我们点击“退出”按钮将应用程序结束掉,再重新打开。我们又再次看到我们退出前的界面,账号密码已经被重新读取出来。


接下来分享几个关于值得推荐的学习地址:

Android平台和java平台 DES加密解密互通程序及其不能互通的原因 .

Android数据库(sqlite)加密方案:

android 3des加密Could not instantiate bean class ....

Android客户端与服务器端通过DES加密认证 .

如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809 微信公众号:终端研发部

(欢迎关注学习和交流)


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存