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加密的过程可以通过下面的图来理解:

整个过程使用非对称与对称加密,由于非对称加密性能比较低,只在第一握手时,如步骤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 谢谢。

Android App数据加密相关推荐

  1. 为你的android App实现自签名的ssl证书

    为你的android App实现自签名的ssl证书(https) 最近公司项目用到https的接口形式,对于一般的网络请求 我们用的是http://******      使用的是 代码用来打开一个  ...

  2. android app渗透测试-Activity、Service

    Android App中可能出现的安全漏洞的类型: 协议--通信协议(本地.网络),协议大部分是由C/C++实现,存在以下安全问题:通信数据引发的逻辑漏洞:通信数据引发的缓冲区溢出等可能导致远程代码执 ...

  3. Android APP安全测试Checklist

    前言 此文档旨在大家提供Android平台APP安全风险与漏洞相关的一般性Checklist,保障安全评估测试的基础质量与效率. 配置安全 发布状态检查 该类漏洞的审查场景:发布的代码未启用代码混淆. ...

  4. 快速android app开发,快速學會開發 Android App

    快速學會開發Android App 作者:吳玉舒 / 臺灣大學計算機及資訊網路中心程式設計組幹事 智慧型手機發展迅速,其中以Android和iOS為主要的平台,根據 2012年6月Nielsen 的調 ...

  5. 通过Appium获取Android app中webview

    因为要测试Android app中嵌入的web页面,所以需要从native切换到webview.网上查了好多帖子,都用到类似下面代码: //判断是否有 WEBVIEW Set<String> ...

  6. 装java 无法应用转换程序_应用程序崩溃“android.app.Application无法强制转换为”...

    我正在解散ORMlite.所以,我有这个DAO工厂类 public class DtoFactory extends Application { private SharedPreferences p ...

  7. Android app 别用中文名

    /************************************************************************** Android app 别用中文名* 说明:* ...

  8. Android提前加载unity程序,Unity项目嵌入Android App实现过程

    1.编写自己的Unity APP,完成后,导出为Android 工程(参数和步骤截图如下),unity版本为:2019.4.16 2.导出的文件夹内容如下截图:我们只使用unityLibrary这个文 ...

  9. 蓝牙模块hc05原理图_使用步进电机和Android App的蓝牙控制迷你升降机

    背景知识视频教程 使用App Inventor创建Android应用​viadean.com Arduino微控制器:学习Arduino制作项目 - 国外课栈​viadean.com Arduino ...

最新文章

  1. 关于Python爬虫原理和数据抓取1.1
  2. MySQL导出到excle显示不了_mysql导出select语句结果到excel文件遇到问题及解决方法_MySQL...
  3. Centos7如何开启端口
  4. 在windows10上搭建caffe
  5. java小程序开发平台,隔壁都馋哭了
  6. 数学如何杀死了雷曼兄弟
  7. 基础知识回顾——通用序列操作
  8. 【laravel5.4】查询构造器对象与模型instance的互相换换
  9. [expimp]exp导出笔记
  10. java设计模式--简单工厂模式
  11. linux如何切换到root用户
  12. 机械硬盘的文件系统突然变成RAW了,如何保住盘上数据?
  13. 《新概念模拟电路》- 晶体管-西北模电王-杨建国著
  14. 在Unity3D中控制动画播放
  15. python模拟布朗运动_如何用Python 实现 几何布朗运动
  16. python 循环十次_python循环10次怎么写
  17. 抖音视频选择封面android,抖音视频封面怎么选取?
  18. 矩阵连乘积问题--动态规划
  19. SQL Sever:关于外键引用无效表的问题
  20. 吴恩达机器学习笔记——含一个隐藏层的神经网络

热门文章

  1. Android使用MediaCodec和OpenGL对多段视频画面进行裁剪和拼接
  2. 设计数据密集型应用(一),DDIA
  3. 利用 Python 进行数据分析 (一):IPython 及 Jupyter notebook
  4. esxi能直通的显卡型号_七彩虹RTX SUPER祝融(火神)版显卡上手体验
  5. 2022-我的秋招之旅
  6. 树莓派3B+插入电源后状态灯只有红灯常亮,无法接入屏幕
  7. 微信小程序——获取openid
  8. 工作中可能会使用到的数据结构和算法
  9. openlayers3中geowebcache的使用
  10. shiro设置ip白名单_亚马逊家庭IP:Luminati的搭建的步骤