密码学 ~ 数字签名

2023-11-08

概念

数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名是非对称密钥加密技术与数字摘要技术的应用。

基本原理

为了理解得清楚,我们通过案例一步一步来讲解。话说张三有俩好哥们A、B。由于工作原因,张三和AB写邮件的时候为了安全都需要加密。于是张三想到了数字签名:

整个思路是这个样子的:

第一步:加密采用非对称加密,张三有三把钥匙,两把公钥,送给朋友。一把私钥留给自己。

第二步:A或者B写邮件给张三:A先用公钥对邮件加密,然后张三收到邮件之后使用私钥解密。

第三步:张三写邮件给A或者B:

(1)张三写完邮件,先用hash函数生成邮件的摘要,附着在文章上面,这就完成了数字签名,然后张三再使用私钥加密。就可以把邮件发出去了。

(2)A或者是B收到邮件之后,先把数字签名取下来,然后使用自己的公钥解密即可。这时候取下来的数字签名中的摘要若和张三的一致,那就认为是张三发来的,再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。

上面的流程我们使用一张图来演示一下:
首先把公钥送给朋友A和B:
在这里插入图片描述
还有就是最后一个比较麻烦的,张三给A或者B发邮件:
在这里插入图片描述

数字证书

上面提到我们对签名进行验证时,需要用到公钥。如果公钥是伪造的,那我们无法验证数字签名了,也就根本不可能从数字签名确定对方的合法性了。这时候证书就闪亮登场了。我们可能都有考各种证书的经历,比如说普通话证书,四六级证书等等,但是归根结底,到任何场合我们都能拿出我们的证书来证明自己确实已经考过了普通话,考过了四六级。这里的证书也是同样的道理。

如果不理解证书的作用,我们可以举一个例子,比如说我们的毕业证书,任何公司都会承认。为什么会承认?因为那是国家发得,大家都信任国家。也就是说只要是国家的认证机构,我们都信任它是合法的。

那么这个证书是如何生成的呢?我们再来看一张图:
在这里插入图片描述
此时即使张三的朋友A把公钥弄错了,张三也可以通过这个证书验证。

网页加密

我们看一个应用“数字证书”的实例:https协议。这个协议主要用于网页加密

首先,客户端向服务器发出加密请求。
在这里插入图片描述
服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。
在这里插入图片描述
客户端(浏览器)的“证书管理器”,有“受信任的根证书颁发机构”列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。
在这里插入图片描述
如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。
在这里插入图片描述
如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。
在这里插入图片描述
如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。
在这里插入图片描述

代码实现

package com.example.password_discipline.signDemo;


import com.example.password_discipline.ras.RsaDemo;
import com.sun.org.apache.xml.internal.security.utils.Base64;

import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;

public class SignDemo {
	public static void main(String[] args) throws Exception {
		String a = "123";
		String algorithm = "RSA";
		PrivateKey aPrivate = RsaDemo.getPrivate("a.pri", algorithm);
		PublicKey publuc = RsaDemo.getPubluc("a.pub", algorithm);
		String signature = getSignature(a, "sha256withrsa", aPrivate);
		System.out.println(signature);
		boolean sha256withrsa = verifySignature(a, "sha256withrsa", publuc, signature);
		System.out.println("校验签名:" + sha256withrsa);

	}

	private static String getSignature(String input, String algorithm, PrivateKey privateKey) throws Exception {
		// 获取签名对象
		Signature signature = Signature.getInstance(algorithm);
		signature.initSign(privateKey);
		signature.update(input.getBytes());
		// 开始签名
		byte[] sign = signature.sign();
		return Base64.encode(sign);
	}

	private static boolean verifySignature(String data, String algorithm, PublicKey publicKey, String signatureData)  throws Exception{
		// 获取签名对象
		Signature signature = Signature.getInstance(algorithm);
		signature.initVerify(publicKey);
		signature.update(data.getBytes());
		return signature.verify(Base64.decode(signatureData));

	}

}

推荐同系列文章

keytool openssl : https://blog.csdn.net/xiaozhegaa/article/details/109602118
密码学 ~ 数字签名: https://blog.csdn.net/xiaozhegaa/article/details/109601966
密码学 ~ 非对称加密 RSA ECC: https://blog.csdn.net/xiaozhegaa/article/details/109601632
密码学 ~ 消息摘要: https://blog.csdn.net/xiaozhegaa/article/details/109601148
对称加密、DES加解密、AES加解密、Base64加解密: https://blog.csdn.net/xiaozhegaa/article/details/109595399

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

密码学 ~ 数字签名 的相关文章

随机推荐

  • 离散信号的Matlab表示

    对任意离散序列x k 需用2个向量来表示 一个表示k的取值范围 另一个表示序列的值 例如序列x k 2 1 1 1 3 0 2 可用Matlab表示为 k 2 4 x 2 1 1 1 3 0 2 若序列从0开始 则只用一个向量x就可表示序列
  • 前端开发: 微信小程序 (文字,链接)生成二维码

    首先最主要的还是通过weapp qrcode js 靠这个轮子就可以了 GitHub yingye weapp qrcode weapp qrcode js 在 微信小程序 中 快速生成二维码https github com yingye
  • 人工智能和机器学习

    机器学习 1 什么是机器学习 在进行特定的编程的情况下 给与计算机学习能力的领域 机器学习是从数据中自动分析获得模型 并利用模型对未知数据进行预测 2 机器学习与人工智能 2 1人工智能发展的三个阶段 1980年代是正式形成时期 1990
  • Java接口详解

    http hi baidu com cxgfhfiupuanour item 370967f74ecbe9cca835a2b4 对初学者来说 接口不是很好理解 现将某高手的一篇文章贴出来 共大家分享 我们来看一个类 class A priv
  • 华为UOS欧拉版 K3S+Rancher 安装完全版

    文章目录 K3S服务 happy path安装过程 1 准备工作 1 1 修改网卡名称为eth0 1 2 切换yum源 1 3 关闭防火墙以及selinux 1 4 修改主机名 并修改hosts 1 5 在UOS 基于华为欧拉 上安装doc
  • vue动画之轮播图

  • Vue自定义组件——封装一个简单的可拖拽的弹出框 可拖拽的Dialog

    首先明确需要传入组件的属性 Props dialogVisible Number 非0打开 allowDrag Boolean 是否可以拖拽 noFoot Boolean 是否显示按钮行 submit Function 点击提交按钮的回调
  • Tomcat 环境变量

    到tomcat官方站点 http www apache org dist jakarta tomcat 4 下载tomcat jakarta tomcat 4 1 30 exe 下载之后安装 比如安装在D Tomcat下 安装完之后 设置环
  • AsyncResult 类的使用

    AsyncResult 类封装异步委托上的异步操作的结果 与异步委托一起使用 从该委托的 BeginInvoke 方法返回的 IAsyncResult 可以强制转换为 AsyncResult AsyncResult 具有 AsyncDele
  • 24、【C++】C++11新特性:Lamda表达式/可变参数模板

    一 Lamda表达式 Lamda表达式是C 11中引入的一项新技术 利用Lamda表达式可以编写内嵌的匿名函数 用以替换独立函数或者函数对象 并且使得代码更可读 是一种匿名函数 即没有函数名的函数 Lamda函数的语法定义如下 captur
  • 过河 【状态压缩DP】+【完整的数论推导过程】

    题目链接 题意 很多人以为青蛙是要跳到石头上 一个个往后跳 问最少需要的石头数量 其实不然 题目给的样例的确也是有些坑了 青蛙每次都有跳的距离范围 题目求的是最少会跳到的石头 青蛙可以在水中起跳 它要尽可能的避开石头 也就是问抵达终点时最少
  • git冲突(git权威指南笔记)

    快进式推送 要推送的本地版本库的提交是建立在远程版本库相应分支的现有提交基础上的 即远程版本库相应分支的最新提交是本地版本库最新提交的祖先提交 查看本地版本库的最新提交及历史提交 git rev list HEAD 查看远程版本库的引用对应
  • MATLAB角谱传播实现!FFT2光斑实际尺寸是多少?

    作者B站ID 大洋咩咩咩咩 投稿有对该代码的讲解视频 角谱传播 如果有那个地方有疑问可以去视频中寻找答案 文章及代码解决三个问题 夫琅禾费衍射 理想凸透镜成像 做FFT2后 仿真光斑的实际尺寸确定 光场在自由空间传播一定距离z后的光斑什么样
  • 求数组中的第三大数

  • java将时间按月分段

    java将时间按月分段 返回分段的数组 按照月份分割一段时间 param startTime 开始时间戳 毫秒 param endTime 结束时间戳 毫秒 public static List
  • 关于Element-ui中Table表格无法显示的问题及解决

    Element ui中Table表格无法显示 1 准备工作 2 引用Element ui官方文档中的Table表格代码 3 启动端口 并在浏览器访问 Element ui表格不生效问题 原因是 Element ui中Table表格无法显示
  • linux设备模型之bus,device,driver分析一

    本文系本站原创 欢迎转载 转载请注明出处 http www cnblogs com gdt a20 内核的开发者将总线 设备 驱动这三者用软件思想抽象了出来 巧妙的建立了其间的关系 使之更形象化 结合前面所学的知识 总的来说其三者间的关系为
  • vscode删除缩进多行tab

    shift tab 转载于 https www cnblogs com v5captain p 9160398 html
  • chrome扩展开发(2)- manifest.json文件简述

    一 本文目标 结合具体应用场景 让读者对manifest json文件的写法和主要属性拥有初步认识 二 目标读者 chrome扩展开发的初学者 想要先从宏观上了解一下chrome扩展能干哪些事情 而不是急于写出一个能运行的demo的人 三
  • 密码学 ~ 数字签名

    概念 数字签名 又称公钥数字签名 是只有信息的发送者才能产生的别人无法伪造的一段数字串 这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明 它是一种类似写在纸上的普通的物理签名 但是使用了公钥加密领域的技术来实现的 用于鉴别数字信