安全与加密常识(3)什么是数字签名和数字证书

文章目录

    • 数字签名
      • 工作原理
      • 关键特点
      • 应用实例
    • 数字证书
    • 数字证书和数字签名趣味实例

数字签名

数字签名是一种通过密码运算生成的数据,用于验证信息的完整性和来源,确保数据在传输过程中未被篡改,同时提供发送者的身份认证和防止抵赖的功能。它基于非对称密码加密系统,使用发送者的私钥对数据进行加密,接收方使用发送者的公钥进行解密和验证,以此来确认信息的完整性和来源。

数字签名的基本原理包括使用哈希函数将原始数据转换成报文摘要,然后用发送者的私钥对摘要进行加密,形成数字签名。接收方收到签名和原始数据后,使用发送者的公钥对签名进行解密,得到哈希摘要。通过比较这个摘要和用相同哈希函数对原始数据重新计算的摘要,可以验证数据的完整性和来源

数字签名常用的算法包括RSA和ECC(椭圆曲线密码学),这些算法提供了足够的安全性,使得第三方难以伪造签名或篡改数据。数字签名与数据加密在原理与应用上的不同之处在于,加密主要关注数据的保密性,防止信息被未经授权的第三方获取,而数字签名则侧重于数据的完整性和发送者身份的验证。

工作原理

数字签名通常利用公钥加密技术,包括以下步骤:

  1. 创建签名
    • 发送方使用自己的私钥对消息或文件的散列(哈希)值进行加密。这个加密后的散列值即为数字签名。
  2. 附加签名
    • 签名通常会附加在消息或文件本身,或以某种形式发送给接收方。
  3. 验证签名
    • 接收方收到消息后,会使用相同的散列算法对消息生成散列值,并用发送方的公钥对数字签名进行解密。
    • 如果解密后的散列值与接收方自行计算的散列值匹配,说明消息未被篡改且签名有效。

在这里插入图片描述
这里的核心关键点在于验证方持有的公钥是签名方给的,签名方的私钥不能泄露。保证以上两点,数字签名才能发挥作用。

假设第三方用自己的私钥给验证方发送伪造消息,验证方使用签名方的公钥肯定是无法解密的。

关键特点

  1. 身份验证
    • 数字签名帮助接收方确认消息或文件确实来自声称的发送方。
  2. 数据完整性
    • 确保数据在传输或存储过程中未被更改。任何对数据的微小更改都会在验证签名时被检测到。
  3. 不可否认性
    • 发送方在对信息进行数字签名后,不能否认之前进行过的通信或交易,这对法律和商业交易尤为重要。

应用实例

  • 电子邮件安全:通过数字签名,电子邮件的接收者可以验证发件人的身份和邮件内容的完整性。
  • 软件分发:开发者对软件包进行签名,用户可以验证软件包是否未被篡改且确实来自于可信的源。
  • 文件和文档签名:数字签名被广泛用于法律文件和其他重要文件,确保文件的内容和签名者的身份得到认证。

数字签名是加密的反向应用,加密是利用私钥来解密数据,而签名是利用公钥来解密数据验证签名。

数字证书

上面在介绍数字签名时提到,接收方需要保证拿到的公钥是发送方的。接收方如何安全的拿到公钥而不被第三方篡改?自然的联想到对公钥进行签名,而签名又需要一对新的公私钥,陷入了无限套娃。套娃自然就交给权威机构(CA)来终止,由它们使用私钥来对申请者提交的公钥和身份信息进行签名,签名生成的东西美其名曰数字证书,颁发给发送方。发送方以后在发送数据时,顺带亮出自己的数字证书(就是公钥),接收方用权威机构的公钥验证下,能解,证明这个就是发送方的公钥。

权威机构也分一级二级三级等套娃,顶级机构颁发的证书叫根证书,不再需要别人证明自己。

数字证书是一种用于确认数字实体身份的电子文件。它通常包含公钥和证书持有者的身份信息(如姓名和电子邮件地址),以及签发机构(CA)的签名,该签名用于验证证书的真实性。

数字证书的格式普遍采用的是X.509V3国际标准,一个标准的X.509数字证书包含以下一些内容:

  1. 证书的版本信息;

  2. 证书的序列号,每个证书都有一个唯一的证书序列号;

  3. 证书所使用的签名算法;

  4. 证书的发行机构名称,命名规则一般采用X.500格式;

  5. 证书的有效期,通用的证书一般采用UTC时间格式;

  6. 证书所有人的名称,命名规则一般采用X.500格式;

  7. 证书所有人的公开密钥;

  8. 证书发行者对证书的签名。

数字证书和数字签名趣味实例

下面以漫画的形式介绍数字证书的由来,翻译自

在这里插入图片描述

鲍勃有两把钥匙,一把是公钥,另一把是私钥。鲍勃的公钥可以给任何人,但是私钥只能自己保存。鲍勃的两个密钥中的任何一个都可以加密数据,另一个密钥可以解密该数据。

在这里插入图片描述

鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。

在这里插入图片描述

苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。尽管帕蒂和道格可能可以拿到苏珊加密后的信且拥有鲍勃的公钥,但是由于他们没有鲍勃的私钥,因此无法解密。

在这里插入图片描述

鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。

在这里插入图片描述

鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信件的摘要(digest)。

在这里插入图片描述

然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature)。

在这里插入图片描述

鲍勃将这个签名,附在信件下面,一起发给苏珊。

在这里插入图片描述

苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。

在这里插入图片描述

苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。

在这里插入图片描述

复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成"数字签名",写信给苏珊,让苏珊用假的鲍勃公钥进行解密。

在这里插入图片描述

后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。

在这里插入图片描述

鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。

在这里插入图片描述

苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。

在这里插入图片描述

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

在这里插入图片描述

首先,客户端向服务器发出加密请求。

在这里插入图片描述

服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。

客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。

在这里插入图片描述

如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。

在这里插入图片描述

如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。

在这里插入图片描述

如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。

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

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

相关文章

Qt: QPushButton 按钮实现 上图标下文字

效果如下: 实现有如下几种方式: 1. 使用 QPushButton 设置 setStyleSheet 例: ui->recorder->setStyleSheet("QPushButton{"\"border: 1px solid #00d2ff; "\"min-height: 60px; "\"col…

python多继承的3C算法

python多继承的3C算法 有很多地方都说python多继承的继承顺序,是按照深度遍历的方式,其实python多继承顺序的算法,不是严格意义上的深度遍历,而是基于深度遍历基础上优化出一种叫3C算法 python多继承的深度遍历 class C:def ru…

MySQL高级-MVCC-原理分析(RR级别)

文章目录 1、RR隔离级别下,仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView2、总结 1、RR隔离级别下,仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView 而RR 是可重复读,在一个事务中&…

Django 配置静态文件

1,DebugTrue 调试模式 Test/Test/settings.py DEBUG True...STATICFILES_DIRS [os.path.join(BASE_DIR, static),] STATIC_URL /static/ 1.1 创建静态文件 Test/static/6/images/Sni1.png 1.2 添加视图函数 Test/app6/views.py from django.shortcuts impor…

uniapp,uni-fab组件拖动属性,替代方案

文章目录 1. 背景2. 替代方案2.1 方案一2.2 方案二 参考 1. 背景 最近基于uniapp开发一款设备参数调试的APP软件,其中有使用到悬浮按钮,快速开发阶段,为了能尽快上线,直接使用了uni-ui的扩展组件uni-fab,参考【1】&am…

Configure C/C++ debugging

Configure C/C debugging launch.json 文件用于在 Visual Studio Code 中配置调试器。 Visual Studio Code 会生成一个 launch.json (位于项目的 .vscode 文件夹下),其中几乎包含了所有必需的信息。要开始调试,您需要填写 program 字段,指定要调试的可执行文件的路径。这必须…

【从零开始学架构 架构基础】四 架构设计的复杂度来源:可扩展性复杂度来源

架构设计的复杂度来源其实就是架构设计要解决的问题,主要有如下几个:高性能、高可用、可扩展、低成本、安全、规模。复杂度的关键,就是新旧技术之间不是完全的替代关系,有交叉,有各自的特点,所以才需要具体…

新书速览|Linux C与C++一线开发实践

《Linux C与C一线开发实践》 本书内容 Linux C/C编程在Linux应用程序开发中占有重要的地位,掌握这项技术将在就业竞争中立于不败之地。《Linux C与C一线开发实践》内容针对初中级读者,贴近软件公司一线开发实践。全书厚达620多页,知识点丰富…

51单片机第6步_stdlib.h库函数

本章重点学习stdlib.h库函数。 #include <REG51.h> //包含头文件REG51.h,使能51内部寄存器; #include <stdlib.h> //float atof (char *s1); //参数s1字符串可包含正负号,小数点或E(e)来表示指数部分,如123.456或123e-2; //若首字符是非数据字符,或为正负号…

[NSSCTF]-Reverse:[SWPUCTF 2021 新生赛]easyapp(安卓逆向,异或)

无壳 把后缀名改为zip&#xff0c;找到apk 查看jadx 这里调用了MainActivity的lambda$onCreate$0$MainActivity&#xff0c;然后又调用了Encoder进行异或。 exp&#xff1a; result棿棢棢棲棥棷棊棐棁棚棨棨棵棢棌 key987654321 flag for i in range(len(result)):flagchr(…

HarmonyOS开发:应用完整性校验

简介 为了确保应用的完整性和来源可靠&#xff0c;OpenHarmony需要对应用进行签名和验签。 应用开发阶段&#xff1a; 开发者完成开发并生成安装包后&#xff0c;需要开发者对安装包进行签名&#xff0c;以证明安装包发布到设备的过程中没有被篡改。OpenHarmony的应用完整性校…

关于响应式编程的理解与SpringCloudGateway的理解

关于响应式编程的理解与SpringCloudGateway的理解 一. 响应式编程与函数式编程的区别二. 响应式编程中常用的组件2.1 RxJava定义2.2 Rxjava基本概念2.3 RxJava 用法 三 SpringcloudGateway四 常见的四种限流规则 一. 响应式编程与函数式编程的区别 总的来说&#xff0c;响应式编…

GPIO和PIN

文章目录 1 GPIO和Pin1.1 GPIO和Pin基础概念1.2 GPIO输入模式1.3 GPIO输出模式1.4 GPIO的HAL库1.4.1 一些HAL库表示1.4.2 HAL库常用GPIO函数1.4.3 GPIO点亮led灯程序例子 1 GPIO和Pin 1.1 GPIO和Pin基础概念 ​ 单片机有很多的引脚&#xff0c;为了操控每一个引脚&#xff0c…

grpc学习golang版( 四、多服务示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写Client客…

MySQL之可扩展性(九)

可扩展性 直接连接 2.修改应用的配置 还有一个分发负载的办法是重新配置应用。例如&#xff0c;你可以配置多个机器来分担生成大报表操作的负载。每台机器可以配置成连接到不同的MySQL备库&#xff0c;并为第N个用户或网站生成报表。 这样的系统很容易实现&#xff0c;但如果…

Spring Boot集成jasypt快速入门Demo

1.什么是Jasypt&#xff1f; Jasypt&#xff08;Java Simplified Encryption&#xff09;是一个专注于简化Java加密操作的工具。 它提供了一种简单而强大的方式来处理数据的加密和解密&#xff0c;使开发者能够轻松地保护应用程序中的敏感信息&#xff0c;如数据库密码、API密…

stl的map和set

概念 map和set底层都是红黑树 set是key模型结构&#xff0c;本质就是看一个元素在不在容器中。 map是key/value结构&#xff0c;里面存了一个pair结构&#xff0c;可以通过一个值来查找另外一个值 map和set结构中遍历出来的都是有序并且去重了的&#xff0c;map和set都支持增…

Java高级重点知识点-17-异常

文章目录 异常异常处理自定义异常 异常 指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。Java处 理异常的方式是中断处理。 异常体系 异常的根类是 java.lang.Throwable&#xff0c;&#xff0c;其下有两个子类&#xff1a;ja…

【QT】概述|对象树模型|两种控件模式|信号和槽|lambda

目录 什么是QT 特点 QT程序 main函数 QT按钮 纯代码模式 图形化模式 对象树模型 信号和槽 连接与断开 自动连接 断开连接 信号的发射 lambda表达式 基本语法 捕获列表 Lambda表达式用于信号与槽的连接 例如 什么是QT Qt是一个跨平台的C图形用户界面应用…

办理河南公司企业信用等级3A证书流程和条件

企业信用等级3A证书属于一种荣誉资质&#xff0c;是提升企业公信力和影响力保障的一项资质。信用等级是信用 (资信)评估机构根据企业资信评估结果对企业信用度划分的等级类别&#xff0c;它反映了企业信用度的高低。AAA信用等级是一种等级划分。代指企业的信用经过行业、机构评…