听说这玩意可以防止否认 —— 数字签名

简介: 发送方发送消息的时候使用私钥对消息进行签名,接收方接收消息的时候使用公钥对签名进行验证即可确定发送者身份。因为签名只能由发送者的私钥完成,所以这个签名一定是由发送者签发的,这样就没有否认的问题了,这就是数字签名(Digital Signature)。

谁骗了谁?


  小艾和小杨是好朋友,并且经常使用固定密钥进行通信。一天小艾收到一条诈骗消息,理所当然,单纯的小艾被骗钱了。小艾kali学的不好,找不到凶手,于是动起了坏心思。小艾将诈骗消息使用和小杨通信的密钥使用单向散列函数计算出MAC然后将消息和 MAC 封装后拿去警察局报警。


  • 小艾:小杨发给我的诈骗消息骗了我的钱。
  • 小杨:我没有发过这条消息。
  • 小艾:你怎么证明不是你发的。
  • 小杨:你怎么证明是我发的。
  • 警察:到底是谁骗了谁?


数字签名


  之前的文章提到消息认证码(MAC)的缺点就是无法防止否认。因为发送方和接收方可以计算出同样的 MAC 值,所以无法判断这个 MAC 值到底是由谁来计算出来的。
  
这个问题的本质在于双方使用同样的密钥生成同样 MAC 值,所以解决这个问题的办法就是让发送者和接收者使用不同的密钥。要求使用不同密钥,很容易想到非对称加密中的公钥与私钥。
  
发送方发送消息的时候使用私钥对消息进行签名,接收方接收消息的时候使用公钥对签名进行验证即可确定发送者身份。因为签名只能由发送者的私钥完成,所以这个签名一定是由发送者签发的,这样就没有否认的问题了,这就是数字签名(Digital Signature)


如何签名与验签?


  • 生成数字签名由消息发送者 A 完成,生成签名就是根据消息内容计算签名值,生成签名意味着认可这个消息的内容。
  • 验证数字签名由消息接受者完成,也可以由第三方来完成。验签成功意味着这个消息是由 A 发出,失败则表示这个消息不是 A 发出的。


  在数字签名的过程中,消息发送者 A 和消息接收者 B 使用不同的密钥来进行签名和验签。这里使用的不同的密钥就是非对称加密中的公钥和私钥。
  
非对称加密中使用公钥加密、私钥解密,数字签名中使用私钥签名、公钥验签,数字签名其实就是公钥密码的反向应用。

公钥

私钥

非对称加密算法

加密消息

解密消息

数字签名

验签

签名


数字签名的方法


1.对消息进行签名


  • 发送者 A 用自己的私钥对消息 M 进行加密生成签名 S
  • A 将加密后的签名 S 和消息 M 发送给接收者 B
  • B 用公钥对签名 S 进行解密,从而得到签名之前的消息 M1
  • B M1 A 直接发送过来的消息 M 进行对比,两者一致则验签成功,否则失败。


2.对消息的hash 值进行签名


  直接对消息进行签名,看起来非常简单,但是在实际应用中很少使用。因为对整个消息进行签名是一个非常耗时的操作,所以我们通常会使用单向散列函数对消息计算出一个 hash 值,然后对这个 hash 值进行签名,这样既可以对消息签名又节省了时间。


  • 发送者 A 用单向散列函数对消息 M 计算 hash H
  • A 用自己的私钥对 H 进行签名 S
  • A 将消息 M 和签名 S 发给接收者 B
  • B A 的公钥对签名 S 进行解密得到 H
  • B 使用单向散列函数对收到的消息 M 计算得到 hash H1,将 H H1 进行比对,两者一致则验签成功,否则失败。


缺点


  • 使用消息认证码(MAC)可以防篡改和仿伪装,但是无法防否认。
  • 使用数字签名可以防篡改、防伪装、防否认。


但是如果验证签名的公钥不是和签名的私钥配对的呢?
  
这样就会导致验签失败,这里我们就需要一个可信任的机构来为我们颁发可信任的公钥,这就需要用到证书了。

相关文章
|
Java 数据库 网络架构
Hystrix使用及其配置详解
Hystrix使用及其配置详解
1996 0
Hystrix使用及其配置详解
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
622 0
|
机器学习/深度学习 应用服务中间件 Linux
API一键搭建智能时光相册,记录你的美
API时代,要搭建一个云相册,就相对来说简单很多,或者说一个开发人员就可以快速实现,并且还能具备智能分析识别、归类、搜索等功能齐全的智能云相册。
4436 0
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
数字化转型需要的技术:生成式AI时代的全栈能力图谱
本文探讨生成式AI推动下的数字化转型技术需求转变,从技术本质、实施路径、伦理规制三方面解构核心要素。技术本质从工具理性进化到能力体系,需建立模型思维、多模态交互和自主进化能力。实施路径分为认知重构、实验验证与迭代优化三个阶段。同时,文章介绍生成式人工智能认证(GAI认证)的战略价值,强调其在能力基准建立、技术合作及创新生态接入中的作用。最后,文章分析组织能力进化与未来技术前沿,如认知智能、具身智能和群体智能的演进方向,为企业提供全面的技术赋能与战略转型指导。
|
10月前
|
存储 Ubuntu Linux
内存卡格式化必看!4个格式化工具与注意事项
今天就给大家推荐几款经过实测的内存卡格式化工具,它们不仅使用简单、支持多种格式,而且在修复损坏卡方面也表现稳定,是实用性与安全性兼具的好帮手。
|
存储 前端开发 JavaScript
深入理解React Fiber架构及其性能优化
【10月更文挑战第5天】深入理解React Fiber架构及其性能优化
678 1
|
Windows
wmiprvse.exe是什么进程?
wmiprvse.exe cpu占用资源很高怎么禁用?
2374 5
|
机器学习/深度学习 分布式计算 Java
《探索 Apache Spark MLlib 与 Java 结合的卓越之道》
本文探讨了Apache Spark MLlib与Java结合的最佳实践,涵盖基础认知、数据预处理、模型选择与构建、训练调优及部署应用。Spark以其分布式计算能力著称,MLlib提供丰富的机器学习算法,Java则拥有成熟生态。两者结合可高效处理大规模数据集,构建灵活的机器学习应用。通过RDD和DataFrame API进行数据操作,利用特征工程工具优化数据,选择合适的分类、回归或聚类模型,并通过管道机制简化工作流。模型训练时合理设置参数并调优,最终将模型部署到生产环境,释放其商业价值。
299 8
|
安全 Go 调度
探索Go语言的并发模式:协程与通道的协同作用
Go语言以其并发能力闻名于世,而协程(goroutine)和通道(channel)是实现并发的两大利器。本文将深入了解Go语言中协程的轻量级特性,探讨如何利用通道进行协程间的安全通信,并通过实际案例演示如何将这两者结合起来,构建高效且可靠的并发系统。
|
人工智能 自然语言处理 分布式计算
阿里云通义灵码使用技巧
随着人工智能技术的发展,云端服务提供商越来越重视在 AI 领域的布局。阿里云推出的**通义灵码**作为其 AI 大模型的重要组成部分,为企业和开发者提供了强大的自然语言处理(NLP)和数据分析能力。在这篇文章中,我们将深入探讨如何高效使用阿里云通义灵码,并为开发者提供一些实用的使用技巧。
912 4