使用RSA工具进行对信息加解密

我们在开发中需要对用户敏感数据进行加解密,比如密码

这边科普一下RSA算法

RSA是非对称加密算法,与对称加密算法不同;在对称加密中,相同的密钥用于加密和解密数据,因此密钥的安全性至关重要;而在RSA非对称加密中,有两个密钥,一个是公钥,用于加密数据,另一个是私钥,用于解密数据;这意味着公钥可以公开分发,而私钥必须保持秘密;RSA非对称加密的主要应用包括:数据加密:使用接收者的公钥加密数据,只有拥有相应私钥的接收者才能解密;
数字签名:使用发送者的私钥对数据签名,接收者可以使用发送者的公钥验证签名,确保数据的完整性和来源的真实性;
密钥协商:RSA也用于安全协议中,如TLS/SSL,用于安全地交换对称加密密钥,从而实现保密通信;
非对称加密算法提供了更高的安全性,因为加密和解密使用不同的密钥,攻击者无法从公钥推导出私钥;但由于非对称加密计算成本高昂,通常不用于大规模数据的加密,而是用于安全协商和数字签名等场景

今天就实现了一个RSA工具类,可以很轻松的对数据进行加解密

不需要加依赖,代码如下

public class RSAUtils {/*** @param plaintext 要加密的字符串* @param publicKeyStr 传入的公钥,是一个字符串* @return 加密后的字符串, 以Base64编码的形式返回* @throws Exception 异常* 这个方法接受一个要加密的字符串和一个公钥字符串,使用公钥进行加密,然后返回加密后的字符串*/public static String encrypt(String plaintext, String publicKeyStr) throws Exception {PublicKey publicKey = getPublicKeyFromString(publicKeyStr);Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);}/*** @param encryptedText 要解密的字符串* @param privateKeyStr 传入的私钥,是一个字符串* @return 解密后的原始字符串* @throws Exception 异常* 这个方法接受一个要解密的字符串和一个私钥字符串,使用私钥进行解密,然后返回解密后的原始字符串*/public static String decrypt(String encryptedText, String privateKeyStr) throws Exception {PrivateKey privateKey = getPrivateKeyFromString(privateKeyStr);Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);byte[] decryptedBytes = cipher.doFinal(encryptedBytes);return new String(decryptedBytes);}/*** @return* @throws Exception* 随机生成一个长度为2048的RSA公私钥对*/public static KeyPair generateKeyPair() throws Exception {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048);return keyPairGenerator.generateKeyPair();}/*** @param publicKey* @return* 拿出刚生成Base64格式的私钥对的公钥字符串*/public static String publicKeyToString(PublicKey publicKey) {return Base64.getEncoder().encodeToString(publicKey.getEncoded());}/*** @param privateKey* @return* 拿出刚生成Base64格式的私钥对的私钥字符串*/public static String privateKeyToString(PrivateKey privateKey) {return Base64.getEncoder().encodeToString(privateKey.getEncoded());}/*** @param publicKeyStr* @return 公钥私钥对象* @throws Exception* 将刚拿出的Base64格式的私钥对的私钥字符串生成公钥对象*/public static PublicKey getPublicKeyFromString(String publicKeyStr) throws Exception {byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr);X509EncodedKeySpec spec = new X509EncodedKeySpec(publicKeyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");return keyFactory.generatePublic(spec);}/*** @param privateKeyStr* @return* @throws Exception* 将刚拿出的Base64格式的私钥对的私钥字符串生成私钥对象*/public static PrivateKey getPrivateKeyFromString(String privateKeyStr) throws Exception {byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr);PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(privateKeyBytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");return keyFactory.generatePrivate(spec);}public static void main(String[] args) throws Exception {// 生成RSA密钥对KeyPair keyPair = generateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();// 将公钥和私钥转换为字符串String publicKeyStr = publicKeyToString(publicKey);String privateKeyStr = privateKeyToString(privateKey);System.out.println("公钥: " + publicKeyStr);System.out.println("私钥: " + privateKeyStr);// 加密和解密测试String plaintext = "大白猫真厉害";String encryptedText = encrypt(plaintext, publicKeyStr);System.out.println("加密后的子串: " + encryptedText);String decryptedText = decrypt(encryptedText, privateKeyStr);System.out.println("解密后的子串: " + decryptedText);}
}

结果如下

1f17c69e518343f882a0d0ed2c8dd1fc.png

将数据用公钥加密,用私钥解密,这样就可以了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/209028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【USRP】5G / 6G OAI 系统 5g / 6G OAI system

面向5G/6G科研应用 USRP专门用于5G/6G产品的原型开发与验证。该系统可以在实验室搭建一个真实的5G 网络,基于开源的代码,专为科研用户设计。 软件无线电架构,构建真实5G移动通信系统 X410 采用了目前流行的异构式系统,融合了FP…

SQLite基本使用

目录 1. 概述2. 引入SQLite3. 连接数据库创建游标4. 创建数据库文件5. 新增单条数据6. 批量新增数据7. 查询单条数据8.查询全部数据9. 查询指定条数的数据10. 修改数据11. 删除数据12. 事务回滚13. 关闭数据库关闭游标1. 概述 SQLite是一个进程内的库,实现了自给自足的、无服务…

【嵌入式开发 Linux 常用命令系列 4.2 -- .repo 各个目录介绍】

文章目录 概述.repo 目录结构manifests/default.xmlManifest 文件的作用default.xml 文件内容示例linkfile 介绍 .repo/projects 子目录配置和管理configHEADhooksinfo/excludeobjectsrr-cache 工作区中的对应目录 概述 repo 是一个由 Google 开发的版本控制工具,它…

使用 OMSA 和 OME 工具管理多个服务器

文章目录 Dell Remote Access Controller (iDRAC)OpenManage Server Administrator(OMSA)OpenManage EnterpriseSupportAssist Enterprise推荐阅读 在DELL服务器的管理工具中,有多个管理工具,今天我们将分享这几个工具的关联性以及…

2023-12-08 工作心得

1 别名不能作为 同一个sql里的where里条件约束 因为别名是在查询结果生成后才得到的,而 WHERE 子句是在查询结果生成前进行的筛选操作,所以别名不能直接用于 WHERE 子句中的条件筛选。 2 jpa sql里如果是删除或修改,加注解 modifying transa…

STM32的几个深入功能

STM32的几个深入功能 目录 1、时钟源2、锁相环3、备份SRAM4、low power mode5、DMA Flash RAM6、复位类型7、CMSIS8、STM32F4学习方法9、中断10、8080 并行接口11、FSMC12、ADC13、IIC14、SPI15、48516、CAN17、MPU6050六轴传感器18、NRF24L01 2.4G无线模块19、FLASH20、外部SR…

【Git系列】branch和tag

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

将单体应用程序迁移到微服务

多年来,我处理过多个单体应用,并将其中一些迁移到了微服务架构。我打算写下我所学到的东西以及我从经验中用到的策略,以实现成功的迁移。在这篇文章中,我将以AWS为例,但基本原则保持不变,可用于任何类型的基…

云原生系列1

1、虚拟机集群环境准备 VirtualBox类似vmware的虚拟化软件,去官网https://www.virtualbox.org/下载最新版本免费的,VirtualBox中鼠标右ctrl加home跳出鼠标到wins中。 VirtualBox安装步骤 https://blog.csdn.net/rfc2544/article/details/131338906 cent…

微信小程序:button微信开放能力打开客服会话分享到聊天框

文档 https://developers.weixin.qq.com/miniprogram/dev/component/button.html 打开客服会话 按钮关键属性 open-type"contact"功能按钮 <button class"mo-open-type"open-type"contact"> </button>分享 <button class&q…

Hive HWI 配置

前言 1、下载安装好hive后&#xff0c;发现hive有hwi界面功能&#xff0c;研究下是否可以运行&#xff0c;于是使用hive –service hwi命令启动hwi界面报错。 启动hwi功能 2、访问192.168.126.110:9999/hwi&#xff0c;发现访问错误 一、HWI介绍 HWI&#xff08;Hive Web Int…

【前端】CSS基础(学习笔记)

一、简介 1、HTML局限性 HTML只关注内容的语义&#xff0c;但是丑&#xff01; 2、CSS概要 CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称&#xff0c;有时我们也会称之为 CSS 样式表或级联样式表。 CSS 是也是一种标记语言 CSS 主要用于设置 HTML 页面中的文本内…

blender 粒子系统 roughness 属性

粒子系统中的Roughness是一种用来控制粒子的随机性和不规则性的属性&#xff0c;它可以影响粒子的发射方向、速度、大小、旋转等。Roughness有以下几个子属性&#xff1a; - **Uniform**&#xff1a;这个属性用来控制粒子的发射方向的随机性&#xff0c;即粒子在法线方向上的偏…

托盘四向穿梭车自动化密集库供应|单机智能向系统智能跨越的HEGERLS托盘四向车系统

随着物流产业的迅猛发展&#xff0c;托盘四向穿梭式自动化密集仓储系统可认为是在穿梭车货架系统基础上提出的一种新仓储概念。托盘四向穿梭式立体库因其在流通仓储体系中所具有的高效密集存储功能优势、运作成本优势与系统化智能化管理优势&#xff0c;已发展为仓储物流的主流…

喜讯:加速度商城系统全系列产品品牌全新升级为Shopfa

2月1日讯&#xff1a;经过1年多的品牌文化塑造&#xff0c;深圳市加速度软件开发有限公司经过研究决定&#xff0c;将旗下的多商户商城系列、小程序商城系列、B2B商城系列、供应商集采系列、电子元器件商城系列、跨境独立站商城系列、MRO工业品商城系列、外卖商城系列、智慧零售…

重写 AppiumService 类,添加默认启动参数,并实时显示启动日志

一、前置说明 在Appium的1.6.0版本中引入了AppiumService类&#xff0c;可以很方便的通过该类来管理Appium服务器的启动和停止。经过测试&#xff0c;使用该类的实例执行关闭server时&#xff0c;并没有释放端口号&#xff0c;会导致第二次启动时失败。另外&#xff0c;使用该…

6.2 U-boot 顶层 Makefile

一、U-boot工程目录分析 如果要分析uboot源码&#xff0c;首先要将uboot源码进行编译&#xff0c;编译需要在Ubuntu进行&#xff0c;把uboot文件放在一个目录下。 编译完成后的文件是这样&#xff1a; 我们需要看的文件夹如下。 1. arch 文件夹 从上图可以看出有很多架构&…

geolife笔记:整理处理单条轨迹

以 数据集笔记 geolife &#xff08;操作篇&#xff09;_geolife数据集-CSDN博客 轨迹为例 1 读取数据 import pandas as pd data pd.read_csv(Geolife Trajectories 1.3/Data//000/Trajectory/20081023025304.plt,headerNone, skiprows6,names[Latitude, Longitude, Not_Im…

【GEE笔记】在线分类流程,标注样本点、分类和精度评价

GEE在线分类流程 介绍 GEE&#xff08;Google Earth Engine&#xff09;是一个强大的地理信息处理平台&#xff0c;可以实现在线的遥感影像分析和处理。本文将介绍如何使用GEE进行在线的分类流程&#xff0c;包括标注样本点、分类和精度评价。本文以2020年5月至8月的哨兵2影像…

什么是散列函数

散列函数是一种公开的数学函数。散列函数运算的输入信息也可叫作报文。散列函数运算后所得到的结果叫作散列码或者叫作消息摘要。散列函数具有如下一些特点&#xff1a; &#xff08;1&#xff09;不同内容的报文具有不同的散列码&#xff0c;而一旦原始报文有任何改变&#xf…