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

news2024/9/25 17:19:20

文章目录

  • 概述
  • 应用
  • 常用数字签名算法
  • 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.coloradmin.cn/o/1486613.html

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

相关文章

从零开始手写RPC框架(3)——ZooKeeper入门

目录 ZooKeeper简介ZooKeeper中的一些概念 ZooKeeper安装与常用命令常用命令 ZooKeeper Java客户端 Curator入门 ZooKeeper简介 是什么? ZooKeeper 是一个开源的分布式协调服务,本身就是一个分布式程序(只要半数以上节点存活,Zo…

Vue+SpringBoot打造海南旅游景点推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…

酷开科技,让酷开系统成为现代生活的变革者

电视,从问世就一直受到人们的追捧。还记得小时候一家人围坐在电视机前的场景,小小的黑白屏幕,牢牢的吸引着大家的目光。随着科技的不断进步,我们的生活也发生了翻天覆地的变化。而电视,也从笨重的黑白电视变成了轻薄的…

8.WEB渗透测试-Linux基础知识-Linux基础操作(二)

内容参考于: 易锦网校会员专享课 上一个内容:7.WEB渗透测试-Linux基础知识-Linux基础操作(一)-CSDN博客 Tab键是补全命令,双击两下Tab键,会告诉你能补全的所有命令 文本编辑器指令:vi 输入vi 1…

React富文本编辑器开发(六)

现在,相关的基础知识我们应该有个大概的了解了,但离我们真正的开发出一个实用型的组件还有一段距离,不过不用担心,我们离目标已经越来越近。 以现在我们所了解的内容而言,或许你发现了一个问题,就是我们的编…

用Java语言创建的Spring Boot项目中,如何传递数组呢??

问题: 用Java语言创建的Spring Boot项目中,如何传递数组呢?? 在这个思路中,其实,Java作为一个后端开发的语言,没必要着重于如何传入,我们主要做的便是对传入的数组数据进行处理即可…

力扣hot6---双指针

题目: TLE做法(哈希两重for循环) 标签虽然说是用双指针,但是第一个想法真就不是双指针呀。。。就感觉这道题很像: 力扣hot1--哈希-CSDN博客 于是就用了类似的想法: 首先要排个序,至于为什么要…

MySQL 如何从 Binlog 找出变更记录并回滚

文章目录 前言1. 案例模拟1.1 确认信息1.2 下载 Binlog1.3 准备环境1.4 注册 Binlog1.5 准备结构信息1.6 Python 订阅1.7 输出结果展示 2. 原理解析2.1 程序设计2.2 模块版本 总结 前言 最近有研发同学问我:有一个问题,想查一个 ID 为 xxxx 的 sku 什么…

Linux(CentOS为例)环境下 Git提交代码加速,使用FastGithub,运行报错解决

当你的在服务器上使用Git进行推送时,时常会出现超时错误。这里使用FastGithub 首先下载FastGithub 这个软件作者不是为什么删除了GithUb的仓库,这个链接还有。下载Linux版本的 FastGithub Linux,Windows版本 下载完毕后解压 ./fastgithu…

Linux课程四课---Linux开发环境的使用(gcc/g++编译器的相关)

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

[VSCode插件] 轻量级静态博客 - MDBlog

MDBlog VSCode插件,基于Markdown的轻量级静态博客系统,同时支持导出为可以部署的静态博客。 仓库 MDBlog 1. Features 博客基础功能:分类管理、文章管理、自动生成索引快捷指令:快捷输入表格、mermaid、wavedrom、代码块发布&a…

Photoshop 2023:重塑创意,引领数字艺术新纪元

在数字艺术的浩瀚星空中,Adobe Photoshop 2023(简称PS 2023)如同一颗璀璨的新星,为Mac和Windows用户带来了前所未有的创意体验。这款强大的图像处理软件不仅继承了前作的精髓,更在细节上进行了诸多创新,让每…

前端el-date-picker传递的日期格式不是自己想要的格式

解决方法: 添加format和value-format属性进行解决。 format“YYYY-MM-DD” value-format“YYYY-MM-DD” 注意:日期格式要用大写!!!!用小写会出现错误,不能回填选择的日期,会直接传入…

【 buuctf-swp】

wget 是什么东西呢? 那就直接过滤 http 流,并全部导出,点击 save all在导出来的一大堆里发现个 zip,需要输入密码,macOS 一大特点就是,如果是伪加密,随便输入一个密码就可以解压缩,…

Redis7 实现持久化的三种方式

1、概述 1.1、Redis持久化的重要性 数据恢复:Redis是一个内存数据库,如果系统或服务宕机,内存中的数据将会丢失。Redis的持久化机制可以把数据保存到磁盘上,以便在系统重启后恢复数据。这是Redis持久化最基本也是最重要的功能。…

基于阿里云OSS上传图片实战案例

一、案例描述 基于Springboot框架实现一个上传图片到阿里云服务端保存的小案例。 二、准备工作 基于Springboot免费搭载轻量级阿里云OSS数据存储库(将本地文本、照片、视频、音频等上传云服务保存)-CSDN博客 三、代码 新建这两个类:一个…

MySQL:开始深入其数据(四)select子查询

select眼熟吧?(都三节了) 又开始学习了 在 MySQL 中,子查询(subquery)是指在一个查询内嵌套另一个完整的 SELECT 语句。子查询可以嵌套在 SELECT、INSERT、UPDATE、DELETE 语句中,用于从内部查询结果中获取数据,进而完…

新加坡大带宽服务器概览

随着全球互联网的迅猛发展,服务器作为支撑网络应用的重要基础设施,扮演着越来越重要的角色。新加坡,作为亚洲四小龙之一,其服务器市场也备受关注。特别是新加坡的大带宽服务器,更是受到了众多企业和个人的青睐。那么&a…

LeetCode -- 79.单词搜索

1. 问题描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水…

SNAP:如何批量预处理Sentinel2 L2A数据集并输出为TIFF文件?

我的需求 我目前就是希望下载哨兵2号数据,然后在SNAP中进行批量提取真彩色波段并输出为TIFF文件。 数据集下载说明 目前哨兵网站似乎进行了一大波更新,连网站都换了,网址如下: https://dataspace.copernicus.eu/ 打开后界面如…