数据传输安全——混合加解密

news/2024/9/16 17:25:19/ 标签: 安全, 网络, java

使用Hutool实现AES与RSA混合加密解密——构建安全的数据传输通道

在当今数字化社会中,信息安全已经成为企业和个人不可忽视的重要议题。加密技术作为保障数据安全的重要手段,其作用愈发突出。本文将深入探讨如何利用Hutool库实现AES与RSA混合加密解密方案,并进一步扩展其背后的技术原理及具体的应用场景。

国密加解密实现参考链接

加密技术概述

在加密领域,我们通常会遇到两种类型的加密算法:对称加密和非对称加密。

  • 对称加密:使用同一个密钥来进行加密和解密。常见的对称加密算法有AES(Advanced Encryption Standard)、DES(Data Encryption Standard)等。优点是速度快、资源消耗少;缺点在于密钥分发困难,一旦密钥泄露则加密信息容易被破解。
  • 非对称加密:采用公钥和私钥的配对形式,加密和解密使用不同密钥。典型的非对称加密算法包括RSA(Rivest-Shamir-Adleman)、ECC(Elliptic Curve Cryptography)等。非对称加密解决了密钥的安全交换问题,但加密解密速度相对较慢。
混合加密技术

为了解决单一加密方式的局限性,混合加密技术应运而生。混合加密通常使用对称加密算法对大量数据进行高效加密,同时使用非对称加密算法对对称密钥进行加密保护。这样既保持了加密过程的高效性,又确保了密钥的安全传输。

Hutool库简介

Hutool是一个Java工具包,它包含了一系列的工具方法,用于简化日常开发任务。在加密解密领域,Hutool提供了AES、RSA等多种加密算法的支持,并且易于集成到项目中去。

示例代码详解

以下是使用Hutool实现AES与RSA混合加密解密的具体示例:

实际请求的时候AES秘钥每次都是新生成的,以增加数据的安全

java">package com.sheldon.tool;import cn.hutool.core.lang.Pair;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.crypto.symmetric.AES;import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;/*** 加密* @author cmm* @ClassName EncryptUtils* @description: TODO* @date 2024年09月03日* @version: 1.0*/
public class EncryptUtil{//    private static final RSA rsa = new RSA();private static final String privateKey ="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIsQuC924lASrZQoDk4FB40NqPcXU7ciAm6KZmwj844fgXIXImxeLQKCYDYZH0C+65bDJ4vm1LY2uRtExnOQTIQRuhnvokvWVVDapzAd6RfUoaefom8otXPnZWIR9aJyIAFbwY4ZFzLOLcjeTs+Yi4uw5huPVYsAzgEXjfuPDXS1AgMBAAECgYAZWLXJaOi84Xqju11IGSCUM/4s8yJ+CYPZ8/3RDghxSgrE6bSLferEP1Eb6x5IJcQ42V8W3767a2P3tWRaYd2gG+n0oWjYEXcgWOE/wtEXlx+qfBFmlL4Zo41fQ88VGr9oTPmpISr3pqGZrkj00dxA67JLYwXwbxo2pYhMCRA5bQJBAMQlr0XA71Awavdo2MS7+NCinyV3Su8A1c2liaa4e+n+SNjd7INDHOy3270z+3AdH39eQiIdWujuioVOAgRgC5cCQQC1gACMUOcHkK5sMylgUOywjsL1fPmH2hJfzxZPMu30weC1bPZfSHZ1vYBCas8gHUQYmeSV7rXutd6w9mjT/TuTAkEAi3I/KVgAywGhCkN/2F3KhokWm4wzubbeSVVmhyCg97nQEF21x5vu9FvB3MEYAJyzx9k7KwWzm+X6lMrgpDukAQJARncfv1pZl9JQJannUoGYoyOKBY0zw86ie5gG7VC0meX7u/RF4tBbTXL5LNATAkDag0KcQKmg8MCjaMkCAeu7CQJAMRk9LZX1kYiWJEK94WWqEIDLrkibE2HO0dObYGWg09QorZuX4Z9IwhkNszLM86H5IwYGEWr+PW4k0WRm5aILHA==";private static final String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLELgvduJQEq2UKA5OBQeNDaj3F1O3IgJuimZsI/OOH4FyFyJsXi0CgmA2GR9AvuuWwyeL5tS2NrkbRMZzkEyEEboZ76JL1lVQ2qcwHekX1KGnn6JvKLVz52ViEfWiciABW8GOGRcyzi3I3k7PmIuLsOYbj1WLAM4BF437jw10tQIDAQAB";private static final String aesKey = "338f6e36c74c4d8f9fdd257fff75e6cf";
//    Stringpublic static void main(String[] args) {System.out.println("------------原始数据-------------\n");String data = "\n《送孟浩然之广陵》\n" +"  唐·李白\n" +"故人西辞黄鹤楼,烟花三月下扬州。\n" +"孤帆远影碧空尽,惟见长江天际流。\n";System.out.println("原始数据:" + data);System.out.println("-------------end-------------\n");Pair<String, String> encrypt = encrypt(data);decrypt(encrypt.getKey(), encrypt.getValue());}private static Pair<String, String> encrypt(String data) {System.out.println("------------开始加密-------------\n");byte[] aesKeyBytes = aesKey.getBytes();AES aes = new AES(Mode.CBC, Padding.PKCS5Padding,new SecretKeySpec(aesKeyBytes, "AES"),new IvParameterSpec(aesKey.substring(0,16).getBytes()));String encryptData = aes.encryptBase64(data, "UTF-8");RSA rsa = new RSA(null, publicKey);String aesKeyEncryptStr = rsa.encryptBase64(aesKeyBytes, KeyType.PublicKey);System.out.println("采用AES加密后的数据:"+encryptData);System.out.println("采用公钥加密后的AES加密数据:"+aesKeyEncryptStr);System.out.println("-------------end-------------\n");return Pair.of(aesKeyEncryptStr,encryptData);}private static void decrypt(String aesKeyEncryptStr,String encryptData) {System.out.println("------------开始解密-------------\n");RSA rsa = new RSA(privateKey, null);String aesKeyDecryptStr =  rsa.decryptStr(aesKeyEncryptStr, KeyType.PrivateKey);AES aes = new AES(Mode.CBC, Padding.PKCS5Padding,new SecretKeySpec(aesKeyDecryptStr.getBytes(), "AES"),new IvParameterSpec(aesKeyDecryptStr.substring(0, 16).getBytes()));byte[] decryptedData = aes.decrypt(encryptData);System.out.println("采用私钥解密后的AES秘钥:"+new String(aesKeyDecryptStr));System.out.println("采用AES解密后的数据:"+new String(decryptedData));System.out.println("-------------end-------------\n");}}
执行结果

执行上述代码后,我们得到了以下的输出结果:

------------原始数据-------------原始数据:
《送孟浩然之广陵》唐·李白
故人西辞黄鹤楼,烟花三月下扬州。
孤帆远影碧空尽,惟见长江天际流。-------------end-------------------------开始加密-------------采用AES加密后的数据:a0r6+JGwvalwip3FjQsPlxwcQfA0yagNiHRVwtgt4GS3qDC4MG3E8/xB4iiNPODpRJtD27M35oCP3ifeWM2lx2hHGOiIL86ZYRL2YP51TuI/kirekQsaGBAtRgEIntbjdS/atDmZ1Z5BUBUE8sMPVTI/dHD9CadwpKS2q4YxsSA17pf3bUdvsZ0vdqlxH0dpo+r7a4jj3ubGkUl5DfHS6Q==
采用公钥加密后的AES加密数据:N768bkPdhb0U4ef8KFXYQCFynhvTgl0qOPzA/3KzkeORfLYkJt4Rv2dMN7tskGlOZVyHEmV4gNktsonkWHSOBbNkXFOHuKuefALCxff7PjAl3ZtXLE+XwUbm+wlV/Zg7NwLAdHViP3n5Cw24Nb0PtWoB4OVZwgFlRwUOu7wWP+0=
-------------end-------------------------开始解密-------------采用私钥解密后的AES秘钥:338f6e36c74c4d8f9fdd257fff75e6cf
采用AES解密后的数据:
《送孟浩然之广陵》唐·李白
故人西辞黄鹤楼,烟花三月下扬州。
孤帆远影碧空尽,惟见长江天际流。-------------end-------------

从输出结果可以看到,原始数据被成功地进行了AES加密,并且AES密钥通过RSA公钥进行了加密保护。之后通过私钥解密得到AES密钥,并使用该密钥成功地解密了数据,恢复了原始信息。

安全性分析

混合加密方案的安全性主要取决于以下几个方面:

  • 密钥强度:无论是对称密钥还是非对称密钥,其长度都直接影响到加密的安全性。建议使用足够长的密钥位数。
  • 密钥管理:对称密钥应该在每次通信时随机生成,并仅限于当前会话使用。
  • 算法选择:选择经过验证的加密算法,避免使用已被破解或存在已知漏洞的算法。
  • 完整性验证:除了加密外,还应加入消息完整性校验机制,如HMAC或数字签名。
应用场景

混合加密技术广泛应用于各种需要保证数据安全的场景中,比如:

  • 在线支付:确保交易双方信息的安全交换。
  • 电子邮件:保护邮件内容不被第三方窃取。
  • 虚拟专用网(VPN):加密数据流,保护用户隐私。
  • 文件同步与备份:确保云端数据的安全
  • 物联网设备:保护设备间通信的安全性。
结语

综上所述,通过Hutool实现AES与RSA混合加密解密不仅可以有效地提升数据传输的安全性,而且还能保持较高的加密解密效率。在实际部署过程中,还需要综合考虑更多的安全措施,如定期更换密钥、使用安全协议(如TLS)等,从而构建一个更为全面的信息安全保障体系。通过这样的技术手段,我们可以更好地保护数据免受恶意攻击,确保信息在传输过程中的安全性和完整性。


http://www.ppmy.cn/news/1522263.html

相关文章

跨平台RTSP播放器之VLC Media Player还是SmartPlayer?

好多开发者纠结&#xff0c;RTSP流播放&#xff0c;到底是用开源的VLC Media Player还是大牛直播SDK的SmartPlayer&#xff1f;针对此&#xff0c;本文做个简单的技术探讨&#xff0c;方便开发者根据实际需要&#xff0c;做适合自己场景的选择&#xff1a; VLC Media Player …

2024高教杯数学建模A题思路

问题1:舞龙队沿螺距为55 cm 的等距螺线顺时针盘入 分析: 龙头速度:龙头前把手的行进速度始终保持1 m/s。螺线参数:螺距为55 cm,即0.55 m。初始条件:龙头位于螺线第16圈A点处。思路: 确定螺线方程:根据螺线的性质,建立极坐标方程,表示螺线各点的位置。计算时间步长:…

PSINS工具箱函数介绍——pvtplot

关于工具箱 pvtplot是绘图函数&#xff0c;用于绘制位置、速度、时间信息 本文所述的代码需要基于PSINS工具箱&#xff0c;工具箱的讲解&#xff1a; PSINS初学指导&#xff1a;https://blog.csdn.net/callmeup/article/details/137087932 使用方法 使用例程&#xff1a; …

无人机之报警器的作用

一、紧急救援与辅助搜救 紧急救援&#xff1a;在事故或紧急情况下&#xff0c;无人机报警器可以迅速发出警报&#xff0c;指引救援人员前往事故地点&#xff0c;提高救援效率。 辅助搜救&#xff1a;无人机搭载报警器可以辅助寻找失踪人员或其他需要搜救的场景&#xff0c;通…

云计算之云原生(上)

目录 一、消息队列RocketMQ 1.1 功能介绍 1.1.1 业务消息首选&#xff1a;消息队列 RocketMQ 1.1.2 【收发流量隔离约束】读写分离控制提高集群稳定性 1.1.3 【Dashboard 仪表盘】实时观测实例状态 1.1.4 【消息轨迹追踪】消息生命周期状态一目了然 1.1.5 【实时扩缩容】…

9月7日微语报,星期六,农历八月初五

&#xff19;月&#xff17;日微语报&#xff0c;星期六&#xff0c;农历八月初五&#xff0c;周末愉快&#xff01; 一份微语报&#xff0c;众览天下事&#xff01; 1、21个部门&#xff1a;符合条件的流动儿童家庭或可配公租房。 2、多所高校2025年招生简章显示&#xff0…

2024第三届大学生算法大赛 真题训练一 解题报告 | 珂学家

前言 题解 这是第三届大学生算法大赛(第二届为清华社杯)的赛前练习赛一. 这是上界比赛的体验报告: 2023第二届“清华社杯”大学生算法大赛 解题报告(流水账版) | 珂学家&#xff0c;个人还是非常推荐这个比赛。 难度分布&#xff1a;4 easy/4 mid-hard/2 hard 赛前练习赛一…

java实现,PDF转换为TIF

目录 ■JDK版本 ■java代码・实现效果 ■POM引用 ■之前TIF相关的问题&#xff08;两张TIF合并&#xff09; ■对于成果物TIF&#xff0c;需要考虑的点 ■问题 ■问题1&#xff1a;无法生成TIF&#xff0c;已解决 ■问题2&#xff1a;生成的TIF过大&#xff0c;已解决 …

Android 系统源码项目加载预编好的so库

Android 系统源码项目加载预编好的so库 文章目录 Android 系统源码项目加载预编好的so库一、前言二、源码中加载so1、Android.mk加载so加载so的主要相关代码&#xff1a; 2、Android.bp加载so&#xff08;1&#xff09;Android.mk使用源码命令编译成Android.bp&#xff08;2&am…

SpringBoot教程(十五) | SpringBoot集成RabbitMq(死信队列、延迟队列)

SpringBoot教程&#xff08;十五&#xff09; | SpringBoot集成RabbitMq&#xff08;死信队列、延迟队列&#xff09; &#xff08;一&#xff09;死信队列使用场景具体用法前提示例: &#xff08;二&#xff09;延迟队列使用场景方法一&#xff1a;通过死亡队列实现方法二&…

【Oracle点滴积累】解决IMP-00017、ORA-20005、ORA-06512错误的方法

广告位招租&#xff01; 知识无价&#xff0c;人有情&#xff0c;无偿分享知识&#xff0c;希望本条信息对你有用&#xff01; 今天和大家分享 IMP-00017: folloging statement failed with ORACLE error 20005 ORA-20005: object statistics are locked (stattype ALL) 错…

WordPress上可以内容替换的插件

插件下载地址&#xff1a;WordPress内容替换插件 – 果果开发 类型 替换的类型&#xff1a;文章、自定义文章类型、分类、标签、媒体库、页面、评论、数据库表&#xff0c;不同的类型可以替换不同的字段。 替换字段 替换的字段&#xff0c;哪些字段内容需要替换。除了数据库…

Q215 数组中第K大的元素

思路 可以用排序&#xff0c;但是不用全有序 还有个要求是O&#xff08;n&#xff09; 快排改版 快排只排需要的部分 public int findKthLargest(int[] nums, int k) {return quickSort(nums, 0, nums.length-1, nums.length-k);}public static int quickSort(int[] nums, …

JVM3-双亲委派机制

目录 概述 作用 如何指定加载类的类加载器&#xff1f; 面试题 打破双亲委派机制 自定义类加载器 线程上下文类加载器 Osgi框架的类加载器 概述 由于Java虚拟机中有多个类加载器&#xff0c;双亲委派机制的核心是解决一个类到底由谁加载的问题 双亲委派机制&#xff…

2409wtl,切换视图

原文 介绍 我从一个基于SDI(单文档接口)WTL向导的应用开始,添加了一些从控件继承的窗口和一些对话框窗口(表单视图),然后才发现我必须,使SDI框架动态加载和卸载子窗口. 本文演示了两个可用来完成的技术:在SDI应用中的视图间动态切换.这是我使用的两个. 技术 1技术:第一个方…

指针作为函数参数详解

一级指针传参 形参指针的指向没有被改变 void test(int* p1) {*p1 8; }int main() {int a 5;int* p &a;test(p);printf("%d\n", a); }输出 8总结: 由代码和上图可知&#xff0c;实参p是个指针&#xff0c;其值为变量a的地址&#xff0c;将其传参给形参p1&…

webpack+lite-server 构建项目示例

首先安装以下库 npm install --save-dev webpack webpack-cli lite-server npm install --save-dev babel-loader babel/core babel/preset-env项目结构 webpack.config.js 配置 const path require("path");module.exports {entry: "./src/index.js",…

5G前传-介绍

1. 引用 知识分享系列一&#xff1a;5G基础知识-CSDN博客 5G前传的最新进展-CSDN博客 灰光和彩光_通信行业5G招标系列点评之二&#xff1a;一文读懂5G前传-光纤、灰光、彩光、CWDM、LWDM、MWDM...-CSDN博客 术语&#xff1a; 英文缩写描述‌BBU&#xff1a;Building Baseba…

华为云征文|Flexus云服务X实例安装ODBC驱动,在ODBC中建立MySQL数据库连接,通过QT连接云数据库

引出 4核12G-100G-3M规格的Flexus X实例使用测评第2弹&#xff1a;Flexus云服务X实例安装ODBC驱动&#xff0c;在ODBC中建立MySQL数据库连接&#xff0c;通过QT连接云数据库 什么是Flexus云服务器X实例 官方解释&#xff1a; Flexus云服务器X实例是新一代面向中小企业和开发…

基于发布-订阅模型的音视频流分发框架

有时需要同时网络推流和把流封装为某格式&#xff0c;或做一些其它操作。这就需要一个分发流的机制&#xff0c;把同一路流分发给多个使用者去操作&#xff0c;下面实现了一个简易的线程安全的音视频流分发框架。代码如下&#xff1a; avStreamHub.h #ifndef STREAMHUB_H #def…