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

文章目录

  • 概述
  • 应用
  • 常用数字签名算法
  • 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等),用于生成和验证数字签名,以实现数据的安全传输和验证。

在这里插入图片描述

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

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

相关文章

云服务器购买教程

在购买云服务器之前,建议仔细评估自身需求和预算,并与多个云服务提供商进行比较,以确保选择到最适合的解决方案。购买云服务器的具体步骤可能因所选云服务提供商而异。以下以实际操作的方式介绍如何购买一款云服务器。 云服务器购买常见问题…

Linux进程——信号详解(上)

文章目录 信号入门生活角度的信号技术应用角度的信号用kill -l命令可以察看系统定义的信号列表信号处理常见方式概述 产生信号通过键盘进行信号的产生,ctrlc向前台发送2号信号通过系统调用异常软件条件 信号入门 生活角度的信号 你在网上买了很多件商品&#xff0…

前端面试练习24.3.2-3.3

HTMLCSS部分 一.说一说HTML的语义化 在我看来,它的语义化其实是为了便于机器来看的,当然,程序员在使用语义化标签时也可以使得代码更加易读,对于用户来说,这样有利于构建良好的网页结构,可以在优化用户体…

vue3项目中如何一个vue组件中的一个div里面的图片铺满整个屏幕样式如何设置

在Vue 3项目中,要使一个div内的图片铺满整个屏幕,你需要确保几个关键点:div元素和图片元素的样式设置正确,以及确保它们能够覆盖整个视口(viewport)。以下是一个简单的步骤和代码示例,帮助你实现…

【JavaSE】实用类——String、日期等

目录 String类常用方法String类的equals()方法String中equals()源码展示 “”和equals()有什么区别呢? StringBuffer类常用构造方法常用方法代码示例 面试题:String类、StringBuffer类和StringBuilder类的区别?日期类Date类Calendar类代码示例…

【vue3】命令式组件封装,message封装示例;(函数式组件?)

仅做代码示例;当然改进的地方还是不少的,仅作为该类组件封装方式的初步启发; 理想大成肯定是想要像 饿了么 这些组件库一样。 有的人叫这函数式组件,有的人叫这命令式组件,我个人还是偏向于命令式组件的称呼。因为以vu…

Django配置静态文件

Django配置静态文件 目录 Django配置静态文件静态文件配置调用方法 一般我们将html文件都放在默认templates目录下 静态文件放在static目录下 static目录大致分为 js文件夹css文件夹img文件夹plugins文件夹 在浏览器输入url能够看到对应的静态资源,如果看不到说明…

支持向量机算法(带你了解原理 实践)

引言 在机器学习和数据科学中,分类问题是一种常见的任务。支持向量机(Support Vector Machine, SVM)是一种广泛使用的分类算法,因其出色的性能和高效的计算效率而受到广泛关注。本文将深入探讨支持向量机算法的原理、特点、应用&…

13. Springboot集成Protobuf

目录 1、前言 2、Protobuf简介 2.1、核心思想 2.2、Protobuf是如何工作的? 2.3、如何使用 Protoc 生成代码? 3、Springboot集成 3.1、引入依赖 3.2、定义Proto文件 3.3、Protobuf生成Java代码 3.4、配置Protobuf的序列化和反序列化 3.5、定义…

【中英对照】【自译】【精华】麻省理工学院MIT技术双月刊(Bimonthly MIT Technology Review)2024年3/4月刊内容概览

一、说明 Notation 仅供学习、参考,请勿用于商业行为。 二、本期封面、封底 Covers 本期杂志购于新加坡樟宜机场Changi Airport Singapore,售价为20.50新元。 本期仍然关注伦敦的AI大会。(笔者十分想去,在伦敦和MIT校园均设有会…

IDEA的安装教程

1、下载软件安装包 官网下载:https://www.jetbrains.com/idea/ 2、开始安装IDEA软件 解压安装包,找到对应的idea可执行文件,右键选择以管理员身份运行,执行安装操作 3、运行之后,点击NEXT,进入下一步 4、…

GraphPad Prism 10: 你的数据,我们的魔法 mac/win版

GraphPad Prism 10是GraphPad Software公司推出的一款功能强大的数据分析和可视化软件。它集数据整理、统计分析、图表制作和报告生成于一体,为科研工作者、学者和数据分析师提供了一个高效、便捷的工作平台。 GraphPad Prism 10软件获取 Prism 10拥有丰富的图表类…

2023义乌最全“电商+跨境+直播”数据总结篇章!

值得收藏|2023义乌最全“电商跨境直播”数据总结篇章! 麦琪享资讯2024-01-20 14:28浙江 新年伊始,央视就把镜头对准了义乌电商,以电商的蓬勃之势展现这座国际商城的开放与活力。 过去的一年 义乌电商量质齐升 实力出圈 跑出了…

nginx 根据参数动态代理

一、问题描述 nginx反向代理配置一般都是配置静态地址,比如: server {listen 80;location / {proxy_pass http://myapp1;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}} 这个反向代理表示访问80端口跳转到 http://myapp1 …

腾讯云优惠券领取入口_先领取再下单_2024腾讯云优惠攻略

腾讯云优惠代金券领取入口共三个渠道,腾讯云新用户和老用户均可领取8888元代金券,可用于云服务器等产品购买、续费和升级使用,阿腾云atengyun.com整理腾讯云优惠券(代金券)领取入口、代金券查询、优惠券兑换码使用方法…

【硬件相关】IB网/以太网基础介绍及部署实践

文章目录 一、前言1、Infiniband网络1.1、网络类型1.2、网络拓扑1.3、硬件设备1.3.1、网卡1.3.2、连接线缆a、光模块b、线缆 1.3.4、交换机 2、Ethernet网络 二、部署实践(以太网)1、Intel E810-XXVDA21.1、网卡信息1.2、检查命令1.2、驱动编译 2、Mella…

C++_数据结构_数据的输入

作用 用于从键盘获取数据 关键字 cin >> 变量示例

YOLOv5论文作图教程(3)— 关于论文作图教程系列采用线上培训的通知(终结篇)

前言:Hello大家好,我是小哥谈。YOLOv5论文作图教程系列其实是我特别擅长的一个模块(本人产品经理出身),自从本系列发表了两篇文章之后,一直没有再继续更新,主要原因是通过文字无法比较好的表达软件的功能及使用,并且也无法达到比较好的培训效果。为了确保大家可以彻底掌…

数据库原理(一)

1、基本概念 学号姓名性别出生年月籍贯220101张三男2003江苏220102李四男2003山东220103王五女2003河北220104赵六女2003天津220105张四男2003北京220106李五女2003江苏220107王六女2003山东220108张七男2003河北220109张九男2003天津220110李十女2003北京 1.1数据&#xff0…

基于springboot+vue的相亲网站

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…