Rsa加解密 + 签名验签

Rsa加解密

  • 概述
    • 聚合算法名称(用于创建加密器)
    • 基本概念
      • 填充方式
      • 分块加密
    • 基本使用
      • 生成密钥
      • 加解密
        • 创建加密器
        • 设置模式(加密)、公钥
        • 对明文加密,并对结果进行Base64编码
        • 对以上结果,进行解密 设置模式(解密)、私钥
      • 签名 + 验签
        • 创建签名器
        • 初始化签名器,加载签名明文
        • 生成签名
        • 初始化验签参数,加载签名明文
        • 验签
      • 关于初始化加密器和签名器的重载方法

概述

RSA 是一种非对称加密算法,它使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据,或者私钥用于签名,公钥用于验证签名。

聚合算法名称(用于创建加密器)

JDK官方文档
常用名称:

  • 加密算法名
    • RSA/ECB/NoPadding
    • RSA/None/NoPadding
    • RSA/ECB/PKCS1Padding
    • RSA/ECB/OAEPWithSHA-1AndMGF1Padding
    • RSA/ECB/OAEPWithSHA-256AndMGF1Padding
  • 签名算法
    • SHA1withRSA(早期使用,现不推荐
    • SHA256withRSA(满足日常需要,一般情况用得最多
    • SHA384withRSA(安全性要求更高,计算成本随着变高)
    • SHA512withRSA(安全性要求极高)
    • MD5withRSA(目前已不推荐使用,MD5被证明存在安全漏洞

基本概念

RSA需要一对密钥对,通常需要代码或工具生成。
原始密钥数据是字节数组,因此如果需要分发或者存储,通常也会进行Base64编码。

填充方式

RSA对明文同样有要求,明文块不能大于密钥长度。因此,通常情况下,也需要进行明文填充,如果选择无填充,那么明文长度如果不是密钥长度倍数,那么可能会报错。

  • PKCS1Padding
    这是最常用的填充方式,基本满足日常使用
  • OAEPOAEPWithSHA-1AndMGF1PaddingOAEPWithSHA-256AndMGF1Padding
    OAEP 是一种更安全的填充方式,主要用于防止选择明文攻击(CPA)等高级攻击方式。它基于哈希函数和掩码生成函数来构建填充结构。多用于安全要求较高的场景,如金融等场景。虽然安全性更高,但是计算成本也更高。
  • NoPadding
    不进行填充,此时对明文有要求,长度须是密钥整数倍。

分块加密

RSA算法要求:单次加密明文长度不能超出密钥长度;如果明文可能超出密钥长度,要么使用ECB分块模式加密,要么手动分块后逐个块加密。
分块模式:ECB(按密钥长度分块)、NONE(不分块)

基本使用

生成密钥

支持密钥长度:512及以下(早期使用,现在少用)、1024(用得较多)、2048(目前使用最多)、3072 位和 4096 位(对安全要求极高的场景,但会增加计算成本

  • 生成密钥对象
KeyPairGenerator pairGenerator = KeyPairGenerator.getInstance("RSA");
pairGenerator.initialize(2048);
KeyPair keyPair = pairGenerator.genKeyPair();
  • 解析出公私钥(可以从密钥对象中获取公私钥)
// 私钥
PrivateKey privateKey = keyPair.getPrivate();
// 公钥
PublicKey publicKey = keyPair.getPublic();
  • 此时的公私钥是以字节数组存在,如果要进行存储和分发。通常使用Base64编码
// 私钥字符串
String privateEncode = Base64.getEncoder().encodeToString(privateKey.getEncoded());// 公钥字符串
String publicEncode = Base64.getEncoder().encodeToString(publicKey.getEncoded())

加解密

创建加密器
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
设置模式(加密)、公钥
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
对明文加密,并对结果进行Base64编码
byte[] bytes = cipher.doFinal(str.getBytes(StandardCharsets.UTF_8));System.out.println("加密后的内容:" + Base64.getEncoder().encodeToString(bytes));
对以上结果,进行解密 设置模式(解密)、私钥
cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
byte[] bytes1 = cipher.doFinal(bytes);
System.out.println("解密后的内容:" + new String(bytes1));

签名 + 验签

我们通常说的RSA签名实际上是一种简略的说法。
RSA签名实际是:签名 + 加密 2个过程。
其中散列算法(或者叫摘要算法,签名算法等等)常用的有:

  • SHA256(大部分场景使用,平衡安全和性能)
  • SHA384
  • SHA512
  • MD5(MD5被证明存在漏洞,不推荐使用)
  • SHA1(早期使用,目前已不推荐使用)

这些散列算法,是独立于RSA的,RSA签名算法名称就是在它们后面增加 withRSA 而已。

所谓RSA签名,只是对散列算法得到的散列值进行RSA加密而已。这一点要明确。
接着上面创建RSA密钥后,开始进行签名与验签

创建签名器

与加解密不同,签名器由Signature这个类提供支持

Signature signature = Signature.getInstance("SHA256withRSA");
初始化签名器,加载签名明文
signature.initSign(keyPair.getPrivate());
signature.update(str.getBytes(StandardCharsets.UTF_8));
生成签名
byte[] byteSign = signature.sign();
System.out.println("签名:" + Base64.getEncoder().encodeToString(byteSign));
初始化验签参数,加载签名明文
signature.initVerify(keyPair.getPublic());
signature.update(str.getBytes(StandardCharsets.UTF_8));
验签
boolean verify = signature.verify(byteSign);
System.out.println("验签结果:" + verify);

关于初始化加密器和签名器的重载方法

在RSA加密场景,除了模式,公钥外,还有个参数SecureRandom random,它用于在一些填充模式(OAEP)下,生成一个随机掩码,提高加密安全性。

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

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

相关文章

docker安装seata

1.准备数据库表 -- the table to store GlobalSession data CREATE TABLE IF NOT EXISTS global_table (xid VARCHAR(128) NOT NULL,transaction_id BIGINT,status TINYINT NOT NULL,application_id VARC…

达梦数据库常用指令都是工作中常用的

达梦数据库连接配置文件名称 cd /etc/dm_svc.conf查询 sql 日志记录是否开启:0 关闭,1/2/3开启); select SF_GET_PARA_VALUE(1,SVR_LOG)union ALL select SF_GET_PARA_VALUE(2,SVR_LOG);关闭 sql 日志记录功能 call SP_SET_PARA_VALUE(1,SVR_LOG,0);开…

大语言模型---Dropout 的定义;Dropout 减少过拟合的原因;Dropout 的实现

文章目录 1. Dropout 的定义2. Dropout 减少过拟合的原因3. Dropout 的实现 1. Dropout 的定义 Dropout 是一种简单而有效的正则化技术,通过在每次训练迭代中随机丢弃(即屏蔽)一部分神经元,强制模型在没有某些特定神经元参与的情…

MVC core 传值session

MVC Entity Framework MVC Core session 》》 需要添加 Session 服务 和 Session中间件 builder.Services.AddSession(); app.UseSession(); 》》》控制器中 public IActionResult Privacy(){HttpContext.Session.SetString("key", "123");return View(…

电气火灾式故障电弧探测器在某医院照明回路中的应用

安科瑞 Acrel-Tu1990 摘要:电气火灾式故障电弧探测器(以下简称“探测器”)能够对连接至其的电路中的故障电弧(包括故障并联电弧和故障串联电弧)进行精确检测。一旦探测到可能导致火灾的故障电弧,探测器将启…

RNN And CNN通识

CNN And RNN RNN And CNN通识一、卷积神经网络(Convolutional Neural Networks,CNN)1. 诞生背景2. 核心思想和原理(1)基本结构:(2)核心公式:(3)关…

大数据营销

大数据营销是一个热门的大数据应用。对于多数企业而言,大数据营销的主要价值源于以下几个方面。 市场预测与决策分析支持 数据对市场预测及决策分析的支持,早就在数据分析与数据挖掘盛行的年代被提出过。沃尔玛著名的“啤酒与尿布”案例就是那个时候的杰…

手机控制载货汽车一键启动无钥匙进入广泛应用

移动管家载货汽车一键启动无钥匙进入手机控车系统‌, 该系统广泛应用于物流运输、工程作业等货车场景,为车主提供了高效、便捷的启动和熄火解决方案,体现了科技进步对物流行业的积极影响‌ 核心功能‌:简化启动流程,提…

SSE基础配置与使用

什么是 Server-Sent Events (SSE) **Server-Sent Events (SSE) **是一种轻量的服务器向客户端推送消息的机制,基于 HTTP 协议实现单向通信,适用于需要实时更新的场景。 与 WebSocket 不同,SSE 只允许服务器向客户端发送数据,因此…

基于python爬虫的智慧人才数据分析系统

废话不多说,先看效果图 更多效果图可私信我获取 源码分享 import os import sysdef main():"""Run administrative tasks."""os.environ.setdefault(DJANGO_SETTINGS_MODULE, 智慧人才数据分析系统.settings)try:from django.core.m…

聊聊Flink:这次把Flink的触发器(Trigger)、移除器(Evictor)讲透

一、触发器(Trigger) Trigger 决定了一个窗口(由 window assigner 定义)何时可以被 window function 处理。 每个 WindowAssigner 都有一个默认的 Trigger。 如果默认 trigger 无法满足你的需要,你可以在 trigger(…) 调用中指定自定义的 tr…

用Python做数据分析环境搭建及工具使用(Jupyter)

目录 一、Anaconda下载、安装 二、Jupyter 打开 三、Jupyter 常用快捷键 3.1 创建控制台 3.2 命令行模式下的快捷键 3.3 运行模式下快捷键 3.4 代码模式和笔记模式 3.5 编写Python代码 一、Anaconda下载、安装 【最新最全】Anaconda安装python环境_anaconda配置python…

基于51单片机的电子秤设计

本设计以STC89C52RC芯片作为主要的控制芯片;通过电阻应变式传感器实现物品的测量功能;通过HX711型A/D转换器完成模拟信号到数字信号之间的转换;矩阵按键实现单片机复位、物品单价输入等系列操作;LCD1602液晶显示屏可以实现测量结果…

ip租期到了

当IP租约到期后,会发生以下过程: 租约到期通知:在租约到期之前,DHCP客户端通常会尝试续租其IP地址。如果客户端仍然活跃并且希望继续使用相同的IP地址,它会向DHCP服务器发送一个DHCP请求(DHCPREQUEST&#…

spring boot如何进行安全测试和渗透测试?

进行安全测试和渗透测试是确保应用程序安全的重要步骤。以下是一些常见的方法和工具,下面小编给大家编写了一个安全测试方法 文章目录 安全测试1. **静态应用安全测试 (SAST)**2. **动态应用安全测试 (DAST)**3. **依赖检查** 渗透测试1. **规划与侦察**2. **漏洞扫…

动态加载Jar包引发的“java.util.zip.ZipException: invalid distance too far back”

当我们用Java语言编写插件容器时,需要动态加载与卸载jar包插件。如果jar包插件中的类存在读取Jar包内打包的资源文件的情况。那么当你升级Jar包插件并再次装载插件时,可能会碰到读取jar包内文件的代码处抛出“java.util.zip.ZipException: invalid dista…

【如何提升代码工程质量】code review篇

应该对于基本上所有软件相关的公司来说,都有committer机制,即代码写好之后会提交合并请求,待相关人员code review通过后再进行合入,所以code review就是代码合入代码仓库的最后一道关卡,对于代码质量的影响也是不容忽视…

原子类、AtomicLong、AtomicReference、AtomicIntegerFieldUpdater、LongAdder

原子类 JDK提供的原子类,即Atomic*类有很多,大体可做如下分类: 形式类别举例Atomic*基本类型原子类AtomicInteger、AtomicLong、AtomicBooleanAtomic*Array数组类型原子类AtomicIntegerArray、AtomicLongArray、AtomicReferenceArrayAtomic…

ClickHouse数据迁移(远程)

一、背景 公司最近买了新的服务器,旧的服务器上面安装了ClickHouse22.2.2.1,新的服务器上面安装了ClickHouse24.9.2.42,两个版本之间要做历史数据迁移 旧服务器:80(IP最后一段,以下代称),ClickHouse版本&am…

Spring Boot日志总结

文章目录 1.我们的日志2.日志的作用3.使用日志对象打印日志4.日志框架介绍5.深入理解门面模式(外观模式)6.日志格式的说明7.日志级别7.1日志级别分类7.2配置文件添加日志级别 8.日志持久化9.日志文件的拆分9.1官方文档9.2IDEA演示文件分割 10.日志格式的配置11.更简单的日志输入…