加密与安全_探索签名算法

文章目录

  • 概述
  • 应用
  • 常用数字签名算法
  • Code
  • DSA签名
  • ECDSA签名
  • 小结

在这里插入图片描述


概述

在非对称加密中,使用私钥加密、公钥解密确实是可行的,而且有着特定的应用场景,即数字签名。

数字签名的主要目的是确保消息的完整性、真实性和不可否认性。通过使用私钥加密消息,发送者相当于对消息进行了签名,因为只有发送者拥有私钥,所以只有发送者能够生成正确的签名。然后,其他人可以使用发送者的公钥来验证签名,确保消息确实是由发送者签署的。

这种方式确保了消息的真实性和不可否认性,因为只有私钥的持有者才能够生成正确的签名,其他人无法伪造。同时,公钥的持有者可以通过验证签名来确认消息的完整性和真实性。

因此,私钥加密产生的密文通常被用作数字签名,而公钥则用于验证签名的有效性。这种方法在保护通信内容的完整性和发送方身份方面发挥着重要作用,是数字证书和加密通信中常用的技术手段之一。

私钥加密得到的密文实际上就是数字签名,要验证这个签名是否正确,只能用私钥持有者的公钥进行解密验证。使用数字签名的目的是为了确认某个信息确实是由某个发送方发送的,任何人都不可能伪造消息,并且,发送方也不能抵赖


应用

实际应用中,对消息的签名不直接针对原始消息,而是对消息的哈希值进行签名,以提高效率和安全性。这样做的好处是,哈希值通常较短且固定长度,而且哈希值的签名不会受到消息长度的影响,同时仍然能够确保消息的完整性和真实性。

signature = encrypt(privateKey, sha256(message))

签名验证过程也是类似的,对签名进行解密得到签名的哈希值,然后与原始消息的哈希值进行比较,以确认签名的有效性和消息的完整性。

hash = decrypt(publicKey, signature)

私钥用于签名,相当于用户的身份标识,只有持有私钥的用户才能够生成正确的签名。公钥用于验证签名,通过验证签名的有效性,可以确认消息确实是由具有对应私钥的用户签名的。这种方式确保了消息的真实性、完整性和发送方的身份认证,是数字签名在安全通信中的重要应用之一。


常用数字签名算法

  1. RSA with SHA-256(SHA256withRSA):结合了RSA非对称加密算法和SHA-256哈希算法。SHA-256产生的哈希值长度为256位,提供了较高的安全性。

  2. RSA with SHA-1(SHA1withRSA):同样结合了RSA非对称加密算法和SHA-1哈希算法。然而,由于SHA-1存在碰撞攻击的漏洞,因此不推荐在新的应用中使用。

  3. RSA with MD5(MD5withRSA):结合了RSA非对称加密算法和MD5哈希算法。然而,MD5也存在碰撞攻击的漏洞,因此也不推荐在安全性要求较高的应用中使用。

  4. ECDSA with SHA-256:基于椭圆曲线数字签名算法(ECDSA)和SHA-256哈希算法,提供了与RSA相当的安全性,但在相同安全级别下使用更短的密钥。

  5. ECDSA with SHA-1:同样基于ECDSA和SHA-1哈希算法。然而,由于SHA-1的安全性问题,不推荐在新的应用中使用。

  6. DSA with SHA-1:基于数字签名算法(DSA)和SHA-1哈希算法。与ECDSA相比,DSA在相同安全级别下需要更长的密钥长度。

在实际应用中,推荐使用RSA with SHA-256ECDSA with SHA-256等结合了安全性和效率的数字签名算法。同时,为了确保安全性,应选择安全性较高的哈希算法,并定期更新密钥以及使用更长的密钥长度。


Code

以下是带有中文注释的代码:

package com.artisan.securityalgjava.sig;

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.*;

public class SignatureTest {

    public static void main(String[] args) throws Exception {
        // 生成RSA公钥/私钥:
        KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");
        kpGen.initialize(1024);
        KeyPair kp = kpGen.generateKeyPair();
        PrivateKey sk = kp.getPrivate(); // 获取私钥
        PublicKey pk = kp.getPublic(); // 获取公钥

        // 待签名的消息:
        byte[] message = "Hello, I am Artisan!".getBytes(StandardCharsets.UTF_8);

        // 用私钥签名:
        Signature s = Signature.getInstance("SHA1WithRSA"); // 获取SHA1WithRSA签名算法的实例
        s.initSign(sk); // 初始化Signature对象,指定使用私钥进行签名
        s.update(message); // 更新要签名的消息
        byte[] signed = s.sign(); // 对消息进行签名
        System.out.println(String.format("signature: %x", new BigInteger(1, signed))); // 打印签名结果

        // 用公钥验证:
        Signature v = Signature.getInstance("SHA1withRSA"); // 获取SHA1withRSA签名算法的实例
        v.initVerify(pk); // 初始化Signature对象,指定使用公钥进行验证
        v.update(message); // 更新要验证的消息
        boolean valid = v.verify(signed); // 验证签名
        System.out.println("valid? " + valid); // 打印验证结果
    }
}

使用了Java的Signature类来进行数字签名和验证。它生成了RSA公钥和私钥,并使用私钥对消息进行签名,然后使用公钥验证签名的有效性。签名算法选择了SHA1WithRSA


DSA签名

DSA(Digital Signature Algorithm)是一种与RSA不同的数字签名算法,它使用了ElGamal数字签名算法的变种。DSA的设计目的是为了提供与RSA相当的安全性,同时在签名和验证速度上更快。

DSA常与SHA(Secure Hash Algorithm)哈希算法结合使用,常用的DSA算法有:

  1. SHA1withDSA:使用SHA-1哈希算法和DSA进行数字签名。

  2. SHA256withDSA:使用SHA-256哈希算法和DSA进行数字签名。

  3. SHA512withDSA:使用SHA-512哈希算法和DSA进行数字签名。

这些算法与RSA相比,具有更快的签名速度。因此,在对性能要求较高的场景中,可以考虑使用DSA算法进行数字签名。

但由于SHA-1存在安全性问题,因此不推荐使用SHA1withDSA。在现代应用中,推荐使用更安全的哈希算法,例如SHA-256或SHA-512结合DSA进行数字签名。


ECDSA签名

ECDSA(Elliptic Curve Digital Signature Algorithm)是一种基于椭圆曲线的数字签名算法,它与DSA类似,但使用了椭圆曲线来提供相同或更高的安全性。

ECDSA的特点包括:

  1. 基于椭圆曲线:与RSA和DSA相比,ECDSA使用椭圆曲线算法来实现数字签名,这使得它能够在保持相同安全级别的情况下使用更短的密钥长度。

  2. 私钥推出公钥:与RSA不同,ECDSA的私钥可以推导出对应的公钥,这使得密钥管理更加灵活。

  3. 高效性能:ECDSA在签名和验证过程中具有较高的性能表现,尤其适用于资源受限的环境。

在加密货币领域,比特币等加密货币通常使用ECDSA算法进行数字签名。比特币采用的椭圆曲线标准是secp256k1,这是一种特定的椭圆曲线参数集。

BouncyCastle库提供了ECDSA的完整实现,可以用于生成密钥对、签名和验证操作。利用BouncyCastle,开发者可以轻松地在Java应用程序中使用ECDSA算法进行数字签名。


小结

数字签名是一种基于非对称加密算法的技术,用于确保数据的完整性、真实性和不可否认性。发送方使用私钥对原始数据进行签名,而接收方使用发送方的公钥来验证签名的有效性。

数字签名的主要作用包括:

  1. 防止伪造:由于只有发送方拥有私钥,因此只有发送方能够生成正确的签名。这样,接收方可以通过验证签名来确认数据的来源,从而防止伪造。

  2. 防止抵赖:由于数字签名是由发送方的私钥生成的,因此发送方不能够抵赖曾经生成过的签名。接收方可以利用签名来证明数据确实是由发送方发送的,从而防止发送方否认其责任。

  3. 检测篡改:数字签名还可以用于检测数据的篡改。如果数据在传输过程中发生了篡改,那么其签名也会失效,因为签名是基于原始数据生成的。接收方可以通过验证签名来确定数据是否经过了篡改。

常用的数字签名算法包括MD5withRSA、SHA1withRSA、SHA256withRSA、SHA1withDSA、SHA256withDSA、SHA512withDSA、ECDSA等。这些算法结合了哈希算法(如MD5、SHA-1、SHA-256等)和非对称加密算法(如RSA、DSA、ECDSA等),用于生成和验证数字签名,以实现数据的安全传输和验证。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2000-2021年全国各省市城乡平均受教育年限数据(分城镇和农村)(含原始数据+计算过程+计算结果)

2000-2021年全国各省市城乡平均受教育年限数据(分城镇和农村) 1、时间:2000-2021年 2、范围:全国及31省 3、来源:人口与就业统计年鉴 4、指标包括:城乡平均受教育年限 、6岁以上总人口 未上过学、…

【卡尔曼滤波】图文结合带你详细推导卡尔曼滤波(超详解)

大家好,好久不见,我是小政。读研期间,我的研究方向是协作定位,涉及到多机器人分布式融合,主要用到了卡尔曼滤波,CI融合等概念。卡尔曼滤波我也是研究了很久,一直在思考的问题就是,卡…

Redis核心数据结构之SDS(一)

数据结构与对象 简单动态字符串 概述 Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,简称C字符串),而是自己构建了一种名为简单动态字符串(Simple Dynamic String, SDS)的后向类型,并将SDS用作Redis的默认字符串表示。在…

代码复现错误

1. 问题: torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 64.00 MiB (GPU 0; 39.59 GiB total capacity; 37.72 GiB already allocated; 38.19 MiB free; 37.83 GiB reserved in total by PyTorch) If reserved memory is >> allocat…

《TCP/IP详解 卷一》第11章 DNS

目录 11.1 引言 11.2 DNS名称空间 11.2.1 DNS命名语法 11.3 名称服务器和区域 11.4 DNS缓存 11.5 DNS 协议 11.5.1 DNS消息格式 11.5.2 DNS 扩展格式(EDNS0) 11.5.3 UDP 或 TCP 11.5.4 问题(查询)和区域区段格式 11.5.…

什么是SpringCloud,有哪些组件?

spring Cloud 是基于spring boot的分布式系统开发工具,它提供了一系列开箱即用的,针对分布式系统开发的特性和组件。用于帮助开发人员快速构建和管理云原生应用程序。 Spring Cloud 的主要目标是解决分布式系统中的常见问题,例如服务发现,负载均衡,配置管理,断路器,消息总…

搜索回溯算法(DFS)1------递归

目录 简介: 递归问题解题的思路模板 例题1:汉诺塔 例题2:合并两个有序链表 例题3:反转链表 例题4:两两交换链表中的节点 例题5:Pow(x,n)-快速幂 结语: 简介&…

C++_哈希表

目录 1、哈希表的用法 2、哈希函数-除留余数法 3、哈希冲突 4、闭散列和开散列 4.1 闭散列 4.1.1 哈希表的扩容 4.1.2 二次探测 4.2 开散列(哈希桶) 4.2.1 开散列的扩容 结语 前言-哈希表概念: 哈希表也是一种存储信息的结构&am…

数据结构(一)——概述

一、绪论 1.1数据结构的基本概念 数据:用来描述客观事物的数、计算机中是字符及所有能输入并被程序识别和处理的符号的集合。 数据元素:数据的基本单位,一个数据元素可由若干数据项组成。 数据结构:指相互之间存在一种或多种特…

“羊驼“入侵CV,美团浙大沈春华团队将LLaMA向CV扩展,构建全新基础模型VisionLLaMA

本文首发:AIWalker https://arxiv.org/abs/2403.00522 https://github.com/Meituan-AutoML/VisionLLaMA 本文概述 大型语言模型构建在基于Transformer的架构之上来处理文本输入, LLaMA 系列模型在众多开源实现中脱颖而出。类似LLaMa的Transformer可以用来处理2D图像吗&#xf…

FreeRTOS学习笔记-基于stm32f103(1)基础知识

一、裸机与RTOS 我们使用的32板子是裸机,又称前后台系统。裸机有如下缺点: 1、实时性差。只能一步一步执行任务,比如在一个while循环中,要想执行上一个任务,就必须把下面的任务执行完,循环一遍后才能执行…

【Java设计模式】三、简单工厂、工厂方法模式、抽象工厂模式

文章目录 0、案例:咖啡屋1、简单工厂模式 静态工厂(不属于23种之列)2、工厂方法模式3、抽象工厂模式4、简单工厂模式 配置文件解除耦合5、JDK源码中对工厂模式的应用 0、案例:咖啡屋 模拟咖啡店点餐。咖啡有多种,抽…

day6 数组 嵌套循环

1&#xff1a;打印杨辉三角 91 int arr[6][6];92 int i,j0;93 for(i0;i<6;i)94 {95 for(j0;j<i;j) 96 {97 if(j0||ij)98 {99 arr[i][j]1; …

14 数值稳定性 + 模型初始化和激活函数【李沐动手学深度学习v2笔记】

1. 数值稳定性 神经网络的梯度 向量对向量求导&#xff08;梯度&#xff09;得到矩阵&#xff0c;太多的矩阵进行乘法会导致常见的两个问题 梯度消失和梯度爆炸 MLP MLP使用ReLU作为激活函数 梯度爆炸的问题 输入很大的时候梯度接近为0 梯度消失 梯度消失的问题 只能训练比…

一个强大的 VS Code 的AI代码插件:Fitten Code

AI 代码助手有 GitHub Copilot&#xff0c;一直想用&#xff0c;但是要爬梯子&#xff0c;还要收费。 一款国产AI写代码神器 Fitten Code&#xff0c;满足了我对AI写代码的幻想。它在功能上基本和 GitHub Copilot 差不多。 重要是的是&#xff0c;免费&#xff0c;免费&#…

【Web - 框架 - Vue】随笔 - Vue的简单使用 - 快速上手

【Web - 框架 - Vue】随笔 - Vue的简单使用 - 快速上手 Vue模板代码 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>模板</title> </head> <body> <div></div>…

安装Docker及DockerCompose

0.安装Docker Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道…

09 Qt扩展LineEdit组件:Input输入框

系列文章目录 01 Qt自定义风格控件的基本原则-CSDN博客 02 从QLabel聊起&#xff1a;自定义控件扩展-图片控件-CSDN博客 03 从QLabel聊起&#xff1a;自定义控件扩展-文本控件-CSDN博客 04 自定义Button组件&#xff1a;令人抓狂的QToolButton文本图标居中问题-CSDN博客 0…

数仓项目6.0(一)

尚硅谷大数据项目【电商数仓6.0】企业数据仓库项目_bilibili 数据流转过程 用户➡️业务服务器➡️数据库存储➡️数仓统计分析➡️数据可视化 数据仓库处理流程&#xff1a;数据源➡️加工数据➡️统计筛选数据➡️分析数据 数据库不是为了数据仓库服务的&#xff0c;需要…

【开源】SpringBoot框架开发数据可视化的智慧河南大屏

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 数据模块 A4.2 数据模块 B4.3 数据模块 C4.4 数据模块 D4.5 数据模块 E 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数据可视化的智慧河南大屏&#xff0c;包含了GDP、…