原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重。

系列文章目录

RSA+AES数据传输的加密解密【篇】,项目实战(专题汇总):

  • AES 加密解密简述 + 完美工具类 AESUtils
  • RSA 加密解密,签名验签简述 + 完美工具类 RSAUtils
  • RSA + AES 加密原理,一线大厂主流的加密手段
  • RSA 与 AES 加密效率对比,用调研事实说明问题,用算法原理解决疑惑
  • RSA + AES 混合加密策略,真实项目案例,一线大厂的主流HTTP加密交互方式(正在赶稿)

前言

在服务器与终端设备进行HTTP通讯时,常常会被网络抓包、反编译(Android APK反编译工具)等技术得到HTTP通讯接口地址和参数。

为了确保信息的安全,在生产中使用了很多种加密手段。大浪淘沙,最终采用 AES+RSA 组合进行接口参数加密和解密的方式脱颖而出,成为了当今主流手段。

如果你还不知道怎么做?那就OUT啦,赶紧来学吧。代码部分有十分详细的测试Demo!!


一、为什么使用 RSA + AES 混合加密

1. 简单阐述

  • RSA 加密机制:属于非对称加密,公钥用于对数据进行加密,私钥对数据进行解密,两者不可逆。公钥和私钥是同时生成的,且一一对应。比如:A拥有公钥,B拥有公钥和私钥。A将数据通过公钥进行加密后,发送密文给B,B可以通过私钥和公钥进行解密。
  • AES 加密机制:属于对称加密,就是说,A用密码对数据进行AES加密后,B用同样的密码对密文进行AES解密。

2. 加密思路

  • 利用 RSA 来加密传输 AES的密钥,用 AES的密钥 来加密数据。
  • 这样做:既利用了 RSA 的灵活性,可以随时改动 AES 的密钥;又利用了 AES 的高效性,可以高效传输数据。

3. 原因

  • 单纯的使用 RSA(非对称加密)方式的话,效率会很低,因为非对称加密解密方式虽然很保险,但是过程复杂,需要时间长;
  • 但是,RSA 优势在于数据传输安全,且对于几个字节的数据,加密和解密时间基本可以忽略,所以用它加密 AES 秘钥(一般16个字节)再合适不过了;
  • 单纯的使用 AES(对称加密)方式的话,死板且不安全。这种方式使用的密钥是一个固定的密钥,客户端和服务端是一样的,一旦密钥被人获取,那么,我们所发的每一条数据都会被都对方破解;
  • 但是,AES有个很大的优点,那就是加密解密效率很高,而我们传输正文数据时,正号需要这种加解密效率高的,所以这种方式适合用于传输量大的数据内容;
  • 基于以上特点,择优取之,就成就了混合加密的【思路】。

二、RSA + AES 的原理

原图来源于网络,也被广泛应用于实际项目的《设计文档》,《接口文档》中,笔者就一直用。

1. 流程:

前提:【服务方】生成一对 RSA 秘钥,自己保留私钥,将公钥由互联网交给【合作方】

从【合作方】向【服务方】方向看 →

  1. 【合作方】使用 AES 秘钥对要传送的报文数据(明文) Data 进行加密,生成密文 EncryData;
  2. 【合作方】使用 RSA 公钥对AES秘钥加密,生成 EncryKey ;
  3. 【合作方】将加密后的 AES 秘钥 EncryKey 和加密后的报文 EncryData 通过网络传输给服务器端;
  4. 【服务方】通过网络拿到上述(3)步骤中的 EncryKey 和 EncryData ;
  5. 【服务方】用 RSA 私钥对 EncryKey (加密的 AES 秘钥)进行解密操作,得到 AesKey;
  6. 【服务方】用 AesKey 解密传入过来的加密报文 EncryData,得到报文数据(明文) Data ,流程结束。

从【服务方】向【合作方】的原理与“上述”是一致的,所以不再絮叨了。

2. 声明

  • 必要解释清楚一点,上图描述的只是“【合作方】向【服务方】发送加密数据,【服务方】解密”的过程,不要误以为是双向;
  • 如果是【服务方】向【合作方】请求,上面的流程需要反过来,并且,必须要由【合作方】生成一对 RSA 秘钥,自己保留私钥,公钥提供给【服务方】才可以,
  • 调用双方,坚决不可使用一对秘钥即加密又解密,这样就失去了 RSA 的意义,没有安全可言。

3. 延伸

实际业务场景下,为了保证请求的合法性,【合作方】还会用RSA算法对请求中的部分数据(到底是哪部分数据,双方提前在文档中约定好)进行【加签】处理,对应的【服务方】需要【验签】。

【验签】通过即为请求合法,解密数据没有问题可以使用,否则不可以使用。

【加签】与【验签】流程的介绍,以及Utils工具类,我会在系列文章中介绍,请查看《系列文章目录》之《项目实战(不是Demo,是大厂真实案例)》。

三、实战演示

把 RSA + AES 加密解密的原理用代码简单的演示一下,方便理解。

下面的代码需要配合我前面讲到的 AESUtils 和 RSAUtils 使用,可以在本篇开头的《系列文章目录》里找到链接。

测试源码已经收录在我的 GitHub 中(文末有地址),有需要的可以自行下载,觉得有用请给个 Star。

1. 代码演示

我尽量把封装在方法中的代码摘出来,让整个流程在一个测试类中就可以解释的明白,也是为了方便大家拷贝测试,所以代码稍显啰嗦,见谅。

import com.alibaba.daily.demos.utils.AESUtils;
import com.alibaba.daily.demos.utils.RSAUtils;
import org.apache.commons.codec.binary.Base64;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.util.HashMap;
import java.util.Map;/*** RSAUtils 工具包测试类** @author Mr.tjm* @date 2020-5-20 11:25*/
@SpringBootTest
public class RSAUtils_Tests {/*** 下面方法验证前需要引入:AESUtils,RSAUtils* AESUtils,RSAUtils工具类网上很多,基本是通用的* 我也为大家准备好了工具类,方法在我的系列博文中,源码和测试类在github上都已收录*/@Testvoid all_process_T(){// 需要加密的字符串String sendMesg = "感谢大家关注「IT无知君」,学无止境,气有浩然,天涯未远,有缘再见。";System.out.println("1. 需要解密传输的数据(sendMesg)为:" + sendMesg);// 用于封装 RSA 随机产生的公钥与私钥Map<Integer, String> keyMap = new HashMap<Integer, String>();/** AES:随机生成加密秘钥 */KeyGenerator keyGen = null;try {keyGen = KeyGenerator.getInstance("AES");keyGen.init(128);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}SecretKey key = keyGen.generateKey();String AESKeyStr = Base64.encodeBase64String(key.getEncoded());System.out.println("2.1 随机生成的AES加密秘钥(AESKeyStr)为:" + AESKeyStr);/** RSA:生成公钥和私钥 */// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象KeyPairGenerator keyPairGen = null;try {keyPairGen = KeyPairGenerator.getInstance("RSA");} catch (NoSuchAlgorithmException e) {e.printStackTrace();}// 初始化密钥对生成器,指定位数,不指定种子keyPairGen.initialize(2048, new SecureRandom());// 生成一个密钥对,保存在keyPair中KeyPair keyPair = keyPairGen.generateKeyPair();RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();    // 得到 RSA 私钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();       // 得到 RSA 公钥// 得到公钥字符串String publicKeyStr = new String(Base64.encodeBase64(publicKey.getEncoded()));System.out.println("2.2 随机生成的公钥(publicKey)为:" + publicKeyStr);// 得到私钥字符串String privateKeyStr = new String(Base64.encodeBase64((privateKey.getEncoded())));System.out.println("2.3 随机生成的私钥(privateKey)为:" + privateKeyStr);/** 关键流程:加密 and 解密(合作方 → 服务方)★☆★☆★☆★☆★☆★ */// 1.合作方:AES秘钥key加密数据String EncryData = AESUtils.encrypt(AESKeyStr, sendMesg, "UTF-8");System.out.println("3. 合作方,AES秘钥key加密后的字符串为:" + EncryData);// 2.合作方:RSA公钥加密AES秘钥key(keyEn)String EncryKey = null;try {EncryKey = RSAUtils.encrypt(AESKeyStr, publicKeyStr);System.out.println("4. 合作方,RSA加密后的AES秘钥key为:" + EncryKey);} catch (Exception e) {e.printStackTrace();}// 互联网数据传输(模拟):合作方将 EncryKey 和 EncryData 传给服务方// 3.服务方:RSA私钥解密AES秘钥key(keyEn)String AesKey = null;try {AesKey = RSAUtils.decrypt(EncryKey, privateKeyStr);System.out.println("5. 服务方,RSA解密后的AES秘钥key为:" + AesKey);} catch (Exception e) {e.printStackTrace();}// 4.服务方:AES秘钥key解密数据String Data = AESUtils.decrypt(AesKey, EncryData, "UTF-8");System.out.println("6. 服务方,AES秘钥key解密后的字符串为:" + Data);}
}

2.执行结果

由于AES秘钥,RSA秘钥对都是随机生成的(RSA方法中没用指定种子seed),所以每次生成的秘钥都是不一样的,但是不影响解密后的结果。

展示其中的一次执行结果:

1. 需要解密传输的数据(sendMesg)为:感谢大家关注「IT无知君」,学无止境,气有浩然,天涯未远,有缘再见。2.1 随机生成的AES加密秘钥(AESKeyStr)为:wdNXO3+EsXrs4jVRQaJEsQ==
2.2 随机生成的公钥(publicKey)为:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjrtDfBZ/dUlNpk6Wm8m6uUlfIl6B80dZQk/BQVxQW3PLws4XNP6/XsFnYAALQfLEiUkrWQCcYTHj++cbbnT6KmxPY9PMkNnPzkNitmLf7XNbhj6vketzPCORxT4wVQd5SVtUWb81ZgujI8MWu1XgBwSV7PKXqQ1du9SZMKIaOwUIDRil0qaJdLr2Y0e+mGIe68CEQUV66taVUrHP7gl4WjUUfkJeG3+dYJghHR5BJkyT847ZdZwR0TjqBFDfoFafTMlFtih0GNVR3qnJp7dYBLgg/5n2ICLXOHHwLT1d7MTPoPxa0+8gPw0KurIE62Ms8VJ4d4TUo9nSyttFlPEEEwIDAQAB
2.3 随机生成的私钥(privateKey)为:MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCOu0N8Fn91SU2mTpabybq5SV8iXoHzR1lCT8FBXFBbc8vCzhc0/r9ewWdgAAtB8sSJSStZAJxhMeP75xtudPoqbE9j08yQ2c/OQ2K2Yt/tc1uGPq+R63M8I5HFPjBVB3lJW1RZvzVmC6Mjwxa7VeAHBJXs8pepDV271Jkwoho7BQgNGKXSpol0uvZjR76YYh7rwIRBRXrq1pVSsc/uCXhaNRR+Ql4bf51gmCEdHkEmTJPzjtl1nBHROOoEUN+gVp9MyUW2KHQY1VHeqcmnt1gEuCD/mfYgItc4cfAtPV3sxM+g/FrT7yA/DQq6sgTrYyzxUnh3hNSj2dLK20WU8QQTAgMBAAECggEAXedMHd57WsGwaYL4yWPuCisAgQ8mddTyH5NzNLo0UAad/vsx/3a+luutRFajEW9T6HKQJ00klTmKoddJj+E8GR8LGEVnJ8F1W2GwFwh0BLfJdkfVoK4EMYPBSsCAceCp5h5FH4qR6iIr4cJfOT7lVhipPqvYJauaiJH1ey6bDUplNhM/B+9FMCmJob1xmxlrijitgxRnHvmV9bSeeDCnVtwa1A32v8ETFUsRqvbHIH28Z8fpaFDYh2ff+qCmfW3pjCyrfSzh4NR4aRrJAqFjl4VUuMTNaXngOVfbPDa58dBSOojpvx4UxbsrdXWuj+5W+uhp1qQrvSYJo/Vg4ibKQQKBgQDKP9LphZruZNk9XLO38fSna45UEc9ZNJ9tAcZqfvxi5fhJ/nmIUe5qleGnheQEX9ktl/tP4LruM6taS2nVcEQ6aw4K9gPxGpq7k2LnzIyouzGacjxFdaLCk+ZMSyE+NlbFmS5hXW51jXal4SCQTgoj4uhvpKQi9g3ManD1tM2yMwKBgQC0qhpVQGQeZjNHePjtzJSsU80i6rm3FLpIrD6AAquYeFr3ZXWpAPUmACprYGZGKRgt4/8dZuk+l9tO+oYr58nSen3hiwTjnnOgKJJvI3CEr/f8kWf7/0usb3EFCRCfUIggqJSu940zfbCI7ul8/RN0z75JZ17QCNpuHR2RJb5GoQKBgDhC7vIlR4cfqMsIGbqG5U8ZfXtnhO3E1MCnKMIBV0ZPwPUchERmvlMKJL7MYTTSUQD88V00H+wZlYZFykgkteYmV7621zvf8cFSa8YdwddCU7cqJhgQdFl6eSsqDzJWPWc0iJFvQ0YSNzpH2R4rh2iaO5yrCTnshsQhrBC93ia/AoGAdPA1o0DOjS6xum1/Esz83p5PhW5RT0PHYAq9WbZgw4wDtWaixgWsqDArRN1c1cT7tZiCJNHb33wDpBdciUa6x9YpbLfDLmH9jYk1X2KdDgWoin7Dw8T3gmGP0iaP7878jccQlj/90XplrfyWfSSCV3WwQWr7X8SbPfLylGTNyIECgYEAlIfSJG47chcyOifqEil/XXviM45ji1lWW3aqtOdHTFK8M9d03TybtGWz8OfoD684nZgyENsRrHFh6OuOQB7YtZGzw2CIzwfrmCP8ZSw1zKDMcOHTiJijOe+2UO1shI+0c4yG5KtHFEnJ4kUostpqbMLH3lRiLFxtxv1BnVPqb4k=3. 合作方,AES秘钥key加密后的字符串为:3cDwQ9cSfW+5NWzbYldy9Yau2crdH4naP1SlTUE+KHGqOZGbyW3ifIwS+KBW3e78Iy2EQndKaYDWP6PH8n+RpofxvStHLPjSVyylgAfvoslzTu/i7aXTxtQhk+Z1hNA6OSMFSCuAzPNVKiD9Ni21vA==
4. 合作方,RSA加密后的AES秘钥key为:R4h7th/IZyYh6v9RLatpAtDYekgKdZhUCYzrTUCkr3d6rP3f1TXRa21aNmzi8+1B1M+i2rMGYZobZ9SQuhE8MLspyKG/KT2PIJmzrRu+iezW17nBmrRHRBtwRY+1L6JWR2z48fpSdI6nlIGjSUJYZPS8ztxNFwfp7786//nl/7mBYEtOKvORqRq3Xhr1rOqZsmbF9mruO+4Zwz4styvpo9Hjnc/kcdIrJcDrGb/d7xYiMyvNeq2o5IBJ0mkE7Rz8KbPu1/5+oAHWLnTM3dommlEx+GkGTwq5PkdTSag90yFNqGFifX43rqoi7FWaYvlbX54skCGWjgGz6onE/lOtvQ==5. 服务方,RSA解密后的AES秘钥key为:wdNXO3+EsXrs4jVRQaJEsQ==
6. 服务方,AES秘钥key解密后的字符串为:感谢大家关注「IT无知君」,学无止境,气有浩然,天涯未远,有缘再见。

重点关注【1】(合作方加密前的数据)和【6】(服务方解密后的数据)。

AES + RSA 加密流程,从【1】和【6】的结果,可以窥见一斑。


总结

  • AES加密更高效,RSA加密更安全;
  • AES + RSA 方案:既利用了 RSA 的灵活性,可以随时改动 AES 的密钥,又利用了 AES 的高效性,可以高效传输数据;
  • 写的并不深奥,希望大家能够理解,在系列文章中会展示“实际开发中如何做”,也会附上真实的《需求文档》,欢迎大家持续关注。

我是IT无知君,您的点赞、评论和关注,是我创作的动力源泉。
学无止境,气有浩然,让我们一起加油,天涯未远,江湖有缘再见!!

RSA + AES加密原理,一线大厂主流的加密手段,流程浅析,有十分详细的测试Demo相关推荐

  1. linux下图片加密原理,Linux中常见的加密技术介绍

    常见的加密技术: 对称加密:非对称加密:单向加密:SSL/TLS:秘钥交换 1.对称加密 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密 ...

  2. ibe加密原理_解析基于身份加密IBE

    基于身份加密(IBE)是一种公共密钥加密方法,在这种加密方法中第三方服务器使用简单的识别符:邮件地址.社会保险号等来生成用于加密和解密电子信息的公共密钥.与传统的公共密钥加密方法相比较,这种加密方法为 ...

  3. 加密算法---RSA 非对称加密原理及使用

    加密算法---RSA 非对称加密原理及使用 一 非对称加密原理介绍 二 加密解密测试 2.1 加密解密工具类 2.2 测试 一 非对称加密原理介绍 非对称加密算法中,有两个密钥:公钥和私钥.它们是一对 ...

  4. phpjiami加密原理详解及解密

    零.引言 最近工作中遇到一些使用phpjiami进行加密的php代码,所以对这个加密进行了详细的分析. 本文包括如下内容: phpjiami的加密原理 详细的phpjiami的解密方法 略带一些Php ...

  5. RSA+AES混合加密实例

    文章目录 前言 一.AES+RSA混合加密是什么? 二.使用步骤 1.引入库 2.RAS+AES加密工具类 总结 Learning Process: 希望可以给你带来帮助!!! 前言 在服务器与终端设 ...

  6. Web技术(三):TLS 1.2/1.3 加密原理(AES-GCM + ECDHE-ECDSA/RSA)

    文章目录 前言 一.TLS 加密原理 1.1 TLS 信息加密 1.2 TLS 完整性校验与认证加密 1.3 TLS 报文结构 1.4 TLS 密钥交换 1.5 TLS 数字签名 1.6 TLS 密码 ...

  7. 数据传输加密非对称加密算法以及对称算法-RSA+AES

    转载:http://blog.csdn.net/chay_chan/article/details/58605605 源码:https://github.com/Javen205/IJPay 数据传输 ...

  8. Android采用AES+RSA的加密机制对http请求进行加密

    前言 最近维护公司APP应用的登录模块,由于测试人员用Fiddler抓包工具抓取到了公司关于登录时候的明文登录信息.虽然使用的是HTTPS的方式进行http请求的,但还是被Fiddler抓到了明文内容 ...

  9. 什么是AES加密?详解AES加密算法原理流程

    在密码学中,加密算法分为双向加密和单向加密.单向加密包括MD5.SHA等摘要算法,它们是不可逆的.双向加密包括对称加密和非对称加密,对称加密包括AES加密.DES加密等.双向加密是可逆的,存在密文的密 ...

最新文章

  1. [USACO]奶牛博览会(DP)
  2. Programming Computer Vision with Python (学习笔记二)
  3. 服务发现技术选型那点事儿
  4. 真正意义的Anchor-Free,FCOS目标检测算法了解一下
  5. 自定义滚动条,可解决火狐滚动条默认样式修改不了问题
  6. 翻译练习:计算机网络
  7. 原来 JS 也支持跟 Lua 语意一样的内嵌函数的闭包概念
  8. c语言上机实验作业答案,第十二次C语言上机实验参考答案
  9. 李宏毅机器学习——深度学习入门
  10. Photoshop如何自定义形状
  11. SCI文献参考基本格式(全)
  12. 带有en的单词有哪些_英语前缀大全en:开头是EN的单词有哪些
  13. 解决macOS邮件mail收取163邮件占用高CPU和下载不动的问题
  14. 如何高效学习和阅读源码?
  15. 测序数据量,测序深度和测序覆盖度
  16. windows server关闭系统自动更新
  17. LIS3DH运动检测调试过程
  18. at91sam9260ek的板级、irq初始化-小试牛刀
  19. elementui表格自定义序号
  20. Lyapunov函数对微分方程稳定性的判别

热门文章

  1. JavaScript前端实现压缩图片功能
  2. 2023年国家高新技术企业申报时间
  3. 伦敦城市大学卡斯商学院MBA招生要求
  4. spack - 无法下载的包怎么办?
  5. 好易听(英语听力)----发布
  6. 美国CS PhD找工作经验总结
  7. python gridfs_python利用mongodb上传图片数据 : GridFS 与 bson两种方式
  8. JMeter系统并发测试
  9. 围绕科教兴国,强化人才建设写一篇1000字心得体会
  10. java 缓冲区溢出_浅析缓冲区溢出