前言

最近维护公司APP应用的登录模块,由于测试人员用Fiddler抓包工具抓取到了公司关于登录时候的明文登录信息。虽然使用的是HTTPS的方式进行http请求的,但还是被Fiddler抓到了明文内容。因此,需要对之前未加密的登录信息进行加密。在网上搜到一篇关于AES+RSA加密方案的文章,如下面链接所示,按照该方案成功解决了加密问题,在这里记录一下。

  • 开放接口的安全验证方案(AES+RSA)

未加密的抓包截图

首先来看看未加密时,通过Fiddler抓包获取的明文信息如图1所示:

  • 图1 未加密时候,Fiddler抓包获取的请求体

  • 图2 未加密时候,Fiddler抓包获取的请求头

通过图1可以明显地看到所有的http请求信息都是透明的。如果真的有有心人去盗窃用户的信息的话,会造成多大的损失。

加密之后的抓包截图

  • 图4 加密之后,Fiddler抓包获取的请求体

  • 图5 加密之后,Fiddler抓包获取的请求头

通过图4,可以看到所有的请求体都通过AES加密后,再使用Base64进行编解码转换后的请求体,即使是被有心人去窃取了,也很难在有效的时间内进行破解。


首先来看一张图,来看看实现该需求用到的几个常用的加解密名词

  • 图6 加解密常用名词

基本需求及概念

随着Internet网的广泛应用,信息安全问题日益突出,以数据加密技术为核心的信息安全技术也得到了极大的发展。目前的数据加密技术根据加密密钥类型可分私钥加密(对称加密)系统和公钥加密(非对称加密)系统。

对称加密算法是较传统的加密体制,通信双方在加/解密过程中使用他们共享的单一密钥,鉴于其算法简单和加密速度快的优点,目前仍然是主流的密码体制之一。最常用的对称密码算法是数据加密标准(DES)算法,但是由于DES密钥长度较短,已经不适合当今分布式开放网络对数据加密安全性的要求。最后,一种新的基于Rijndael算法对称高级数据加密标准AES取代了数据加密标准DES。非对称加密由于加/解密钥不同(公钥加密,私钥解密),密钥管理简单,也得到广泛应用。RSA是非对称加密系统最著名的公钥密码算法。

AES算法

AES基本原理及算法流程

美国国家标准和技术研究所(NIST)经过三轮候选算法筛选,从众多的分组密码中选中Rijndael算法作为高级加密标准(AES)。Rijndael密码是一个迭代型分组密码,分组长度和密码长度都是可变的,分组长度和密码长度可以独立的指定为128比特,192比特或者256比特。AES的加密算法的数据处理单位是字节,128位的比特信息被分成16个字节,按顺序复制到一个4*4的矩阵中,称为状态(state),AES的所有变换都是基于状态矩阵的变换。

用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表1所示)。在轮函数的每一轮迭代中,包括四步变换,分别是字节代换运算(ByteSub())、行变换(ShiftRows())、列混合(MixColumns())以及轮密钥的添加变换AddRoundKey()[3],其作用就是通过重复简单的非线形变换、混合函数变换,将字节代换运算产生的非线性扩散,达到充分的混合,在每轮迭代中引入不同的密钥,从而实现加密的有效性。

表1 是三种不同类型的AES加密密钥分组大小与相应的加密轮数的对照表。加密开始时,输入分组的各字节按表2 的方式装入矩阵state中。如输入ABCDEFGHIJKLMNOP,则输入块影射到如表2的状态矩阵中。

表1:

AES类型 密钥长度 分组长度 加密轮数
AES-128 4字 4字 10
AES-192 6字 4字 12
AES-256 8字 4字 14

表2:

A E I M
B F J N
C G K O
D H L P

  • 1、字节代换运算(ByteSub())

    字节代换运算是一个可逆的非线形字节代换操作,对分组中的每个字节进行,对字节的操作遵循一个代换表,即S盒。S盒由有限域 GF(28)上的乘法取逆和GF(2)上的仿射变换两步组成。

  • 2、行变换ShiftRows()

    行变换是一种线性变换,其目的就是使密码信息达到充分的混乱,提高非线形度。行变换对状态的每行以字节为单位进行循环右移,移动字节数根据行数来确定,第0行不发生偏移,第一行循环右移一个字节,第二行移两个,依次类推。

+3、 列混合变换MixColumns()

列变换就是从状态中取出一列,表示成多项式的形式后,用它乘以一个固定的多项式a(x),然后将所得结果进行取模运算,模值为 x4+1。其中a(x)={03}x3+{02}x2+{01}x+{02}, 
这个多项式与x4+1互质,因此是可逆的。列混合变换的算术表达式为:s’(x)= a(x) s(x),其中, s(x)表示状态的列多项式。

  • 4、轮密钥的添加变换AddRoundKey()

    在这个操作中,轮密钥被简单地异或到状态中,轮密钥根据密钥表获得,其长度等于数据块的长度Nb。

AES算法流程

对于发送方,它首先创建一个AES私钥,并用口令对这个私钥进行加密。然后把用口令加密后的AES密钥通过Internet发送到接收方。发送方解密这个私钥,并用此私钥加密明文得到密文,密文和加密后的AES密钥一起通过Internet发送到接收方。接收方收到后再用口令对加密密钥进行解密得到AES密钥,最后用解密后的密钥把收到的密文解密成明文。图7中是这个过程的实现流程。

  • 图7 AES算法流程

RSA算法

RSA算法基本原理及流程

RSA是在1977年发明RSA密码系统的三个人的名字的首字母的缩写,他们是:Ron Rivest、Adi Shamir和Leonard Adleman。它是第一个公钥加密算法,在很多密码协议中都有应用,如SSL和S/MIME。RSA算法是基于大质数的因数分解的公匙体系。简单的讲,就是两个很大的质数,一个作为公钥,另一个作为私钥,如用其中一个加密,则用另一个解密。密钥长度从40到2048位可变,密钥越长,加密效果越好,但加密解密的开销也大。RSA算法可简单描述如下:

公开密钥:n=pq,(p,q为两个不同的很大的质数,p和q必须保密)
将(p-1)和(q-1)相乘得到φ(n)
选择一个整数e (1<e<φ(n))与φ(n)互质
秘密密钥:d=e-1modφ(n),即计算一个数字d,使得它满足公式 de=1 modφ(n)
加密:c=mc(mod n)
解密:m=cd(mod n),m为明文,c为密文。

RSA算法实现流程

首先,接收方创建RSA密匙对,即一个公钥和一个私钥,公钥被发送到发送方,私钥则被保存在接收方。发送方在接收到这个公钥后,用该公钥对明文进行加密得到密文,然后把密文通过网络传输给接收方。接收方在收到它们后,用RSA私钥对收到的密文进行解密,最后得到明文。图8是整个过程的实现流程。

  • 图8 RSA算法实现流程

AES与RSA相结合数据加密方案

RSA算法是公开密钥系统的代表,其安全性建立在具有大素数因子的合数,其因子分解困难这一法则之上的。Rijndael算法作为新一代的高级加密标准,运行时不需要计算机有非常高的处理能力和大的内存,操作可以很容易的抵御时间和空间的攻击,在不同的运行环境下始终能保持良好的性能。这使AES将安全,高效,性能,方便,灵活性集于一体,理应成为网络数据加密的首选。相比较,因为AES密钥的长度最长只有256比特,可以利用软件和硬件实现高速处理,而RSA算法需要进行大整数的乘幂和求模等多倍字长处理,处理速度明显慢于AES[5];所以AES算法加解密处理效率明显高于RSA算法。在密钥管理方面,因为AES算法要求在通信前对密钥进行秘密分配,解密的私钥必须通过网络传送至加密数据接收方,而RSA采用公钥加密,私钥解密(或私钥加密,公钥解密),加解密过程中不必网络传输保密的密钥;所以RSA算法密钥管理要明显优于AES算法。

从上面比较得知,由于RSA加解密速度慢,不适合大量数据文件加密,因此在网络中完全用公开密码体制传输机密信息是没有必要,也是不太现实的。AES加密速度很快,但是在网络传输过程中如何安全管理AES密钥是保证AES加密安全的重要环节。这样在传送机密信息的双方,如果使用AES对称密码体制对传输数据加密,同时使用RSA不对称密码体制来传送AES的密钥,就可以综合发挥AES和RSA的优点同时避免它们缺点来实现一种新的数据加密方案。加解密实现流程如图(9)。

  • 图9 AES与RSA相结合数据加密方案流程 

具体过程是先由接收方创建RSA密钥对,接收方通过Internet发送RSA公钥到发送方,同时保存RSA私钥。而发送方创建AES密钥,并用该AES密钥加密待传送的明文数据,同时用接受的RSA公钥加密AES密钥,最后把用RSA公钥加密后的AES密钥同密文一起通过Internet传输发送到接收方。当接收方收到这个被加密的AES密钥和密文后,首先调用接收方保存的RSA私钥,并用该私钥解密加密的AES密钥,得到AES密钥。最后用该AES密钥解密密文得到明文。

Android端 AES+RSA结合实践

基本要求

  1. 保证传输数据的安全性
  2. 保证数据的完整性
  3. 能够验证客户端的身份

基本流程

Android端

  1. 服务器端(server)分别生成自己的RSA密钥对,并提供接口给Android客户端获取RSA公钥(rsaPublicKey)
  2. client生成AES密钥(aesKey)
  3. client使用自己的AES密钥(aesKey)对转换为json格式的请求明文数据(data)进行加密,得到加密后的请求数据encryptData
  4. client使用server提供的接口获取RSA公钥(rsaPublicKey)
  5. client使用获取RSA公钥(rsaPublicKey)对AES密钥(aesKey)进行加密,得到encryptAesKey
  6. client将encryptAesKey作为http请求头参数,将加密后的请求数据encryptData作为请求体一起传输给服务器端

服务器端

  1. server响应client的http请求,读取http请求头。获得client传过来的加密后的AES密钥(encryptAesKey),读取http请求体,获得client传过来的加密后的请求数据(encryptData)。
  2. server使用自己的RSA私钥(rsaPrivateKey)对加密后的AES密钥(encryptAesKey)进行RSA解密,得到AES密钥(aesKey)
  3. 使用解密后的AES密钥(aesKey)对加密后的请求数据(encryptData),进行AES解密操作,得到解密后的请求数据(data),该数据为json格式
  4. 对解密后的请求数据(data)进行json解析,然后做相关的响应操作。

基本上如下图所示的流程:

由于公司代码设计的内容太多,不好贴在此处。大家可以参考参考下面的这个github上面的链接学习一下,本人的实现方式也是参考了下面的代码,具体的流程还是要和服务器人员配合一起出方案,进行AES和RSA加密的时候,注意一定要和服务器那边的加密算法要一致,否则服务器可能无法进行解密操作。

java版示例

AES+RSA双重加密Java示例

更多参考

  • 关于AES256算法java端加密,ios端解密出现无法解密问题的解决方案

    http://my.oschina.net/nicsun/blog/95632

  • Java 运用 Bouncy Castle 进行 AES128 加密解密(CBC 模式 PKCS7 填充 )

    http://blog.csdn.net/aflight/article/details/13626385

  • 安全篇-AES/RSA加密机制

    http://www.jianshu.com/p/ec7bb7325ff2

  • 开放接口的安全验证方案(AES+RSA)

    https://wustrive2008.github.io/2015/08/21/%E5%BC%80%E6%94%BE%E6%8E%A5%E5%8F%A3%E7%9A%84%E5%AE%89%E5%85%A8%E9%AA%8C%E8%AF%81%E6%96%B9%E6%A1%88(AES+RSA)/

  • Java加密解密快速入门【包括MD5、BASE64、DES、RSA等算法】 上篇

    http://hello-nick-xu.iteye.com/blog/2103775

  • Java加密解密快速入门【包括MD5、BASE64、DES、RSA等算法】 下篇

    http://hello-nick-xu.iteye.com/blog/2103781

  • 【java】AES加密解密|及Base64的使用

    http://www.cnblogs.com/arix04/archive/2009/10/15/1511839.html

  • .NET/android/java/iOS AES通用加密解密

    http://www.cnblogs.com/jys509/p/4768120.html

  • 安全篇-AES/RSA加密机制

    http://www.jianshu.com/p/ec7bb7325ff2

  • IOS & JAVA RSA Encryption & Decryption

    http://www.cnblogs.com/makemelike/articles/3802518.html

  • doc_rsa_java

    http://cryptojs.altervista.org/publickey/doc/doc_rsa_java.html

  • 密码算法详解——AES

    http://www.mamicode.com/info-detail-514466.html

原文地址:http://blog.csdn.net/ouyang_peng/article/details/50983574

Android采用AES+RSA的加密机制对http请求进行加密相关推荐

  1. 网络请求中常见的加密机制和加密算法理解 流量加密

    请求安全性: 服务器端在接收到请求的时候,要主动鉴别该请求是否有效,是否可接受. token:已登陆用户的识别码 解决的问题:用户调用接口时,不用每次都带上用户名和密码,避免了频繁在网络中传输密码被截 ...

  2. Android网络请求加密机制详解

    Android开发中,难免会遇到需要加解密一些数据内容存到本地文件.或者通过网络传输到其他服务器和设备的问题,但并不是使用了加密就绝对安全了,如果加密函数使用不正确,加密数据很容易受到逆向破解攻击.还 ...

  3. JS逆向--PyExecJS基本用法--网易云音乐逆向思路,node.js安装教程,逆向思路,逆向分析,加密机制,RSA,AES加密算法,加密算法啊破解,js引擎,定位数据包,分析栈结构,无痕窗口

    文章目录 前言 一.JS逆向以及PyExecJS模块介绍 1.JS逆向 2.PyEecJS 二.使用步骤 1.环境安装 安装PyExecJS模块 安装node.js开发环境(官网链接 https:// ...

  4. 密码学 aes rsa 分段加密 填充 rsakey 生成

    文章目录 1 可逆加密/解密 1.1 BASE64 2 不可逆加密 2.1 MD5 2.2 SHA256 2.3 SHA512 2.4 MAC加密 3 对称加密解密 3.1 des加密和解密 3.2 ...

  5. 自学Android开发 AES加密

    目录 一.问题 二.解决源码 一.问题 在Java 后端发来的AES加密数据时,发现Android APP不能解密 而且Android 端 加密同样的数据返回的结果居然不一致,所以我在网上查询后,发现 ...

  6. 对称加密算法AES联合设备IMEI码设计的加密机制

    AES算法介绍 对称加密算法 AES,密码学中的高级加密标准(Advanced Encryption Standard,AES),又称高级加密标准Rijndael加密法,是美国联邦政府采用的一种区块加 ...

  7. 浅谈客户端与服务端的加密通讯(HTTPS/AES/RSA/RequestBodyAdviceAdapter/ResponseBodyAdvice)

    目录 前言 HTTPS与SSL证书 AES对称加密 RSA非对称加密 AES + RSA 组合加密 服务端请求参数解密拦截器RequestBodyAdviceAdapter 服务端返回参数加密拦截器R ...

  8. [crypto]-53-openssl命令行的使用(aes/rsa签名校验/rsa加密解密/hmac)

    常用技巧 如何编写一个二进制规律性的文件, 比如你可以编写一个"0123456789abcdef"的文本文件,记得删除换行符然后用ultraedit打开,ctrl+H就可以看到二进 ...

  9. android强制选择器,谷歌手软了:不再强制在Android Q采用隔离存储沙盒机制

    原标题:谷歌手软了:不再强制在Android Q采用隔离存储沙盒机制 IT之家4月26日消息 在Android Q的首个Beta版中,谷歌推出了一个隐藏的.激进的隔离存储沙盒机制,名为"Sc ...

最新文章

  1. 【加强版】js原生实现拖拽效果,这次没有用document的mousedown、mousemove、mouseup事件我们来点实际的(但是有个弊端:拖拽过程中鼠标会变成一个禁用符号,不太友好)
  2. 科略教育——执行力的3W管理法
  3. redis报错(error) LOADING Redis is loading the dataset in memory
  4. linux命令-eq是什么意思,linux查看系统信息命令
  5. native字体尺寸自适应 react_React Native之图片/宽高/字体平台适配
  6. .net 集合分成几个等数量集合_一课研究之集合图的应用教学设计
  7. CCNA学习指南 第五章 下载
  8. 科学发明家特斯拉传记
  9. 石墨烯 量子计算机,带石墨烯的量子计算
  10. c语言正确声明的格式,c语言函数声明格式是什么?
  11. FBReader阅读引擎支持的功能
  12. MathType求和符号中的黑三角该如何消除
  13. oob袋外估计matlab,机器学习:随机森林RF-OOB袋外错误率
  14. TCP Congestion性能测试分析
  15. [论文分享] Stegozoa: Enhancing WebRTC Covert Channels with Video Steganography for Internet Censorship
  16. ViT强势应用 | V2X基于ViT提出了一个具有V2X通信的强大协作感知框架
  17. “智慧高速公路”建设应重点提升“智慧化的出行服务”
  18. JAVA程序设计基础期末复习资料
  19. 电信高清语音服务器,电信VoLTE高清通话来了,来电秒接通、打电话4G不掉线!...
  20. Xilinx Srio详解IP核使用

热门文章

  1. 多房间计时器swing
  2. linux 查看yum 进程,Linux YUM之YUM命令
  3. Box2D C++ 物理世界与自定义重力
  4. 根据井深选用不同的水泥种类及性能
  5. 利用python实现SNM模型
  6. 投资学,从入门到精通,七本书
  7. python 去掉中文或英文
  8. 对原data数据进行修改》
  9. vue 在线预览PDF
  10. 图隐私论文速递:A graph modification approach for k‑anonymity in social networks using the genetic algorith