哈工大计算机网络课程网络安全基本原理详解之:消息完整性与数字签名

news2025/1/21 6:36:06

哈工大计算机网络课程网络安全基本原理详解之:消息完整性与数字签名

这一小节,我们继续介绍网络完全中的另一个重要内容,就是消息完整性,也为后面的数字签名打下基础。

报文完整性

首先来看一下什么是报文完整性。

报文完整性,也称为消息完整性(message integrity),有时也称为报文/消息认证(或报文鉴别),目标:

  • 证明报文确实来自声称的发送方

    比如接收端在收到报文时能够确认,报文是由指定发送方发送的。这一过程也是与我们上一节中介绍的身份认证相关的。

  • 验证报文在传输过程中没有被篡改。

  • 预防报文的时间、顺序被篡改。

  • 预防报文持有期被修改。

    比如Bob给Alice发报文,还应该预防Alice在持有报文时,有意或无意修改报文。

  • 预防报文在发送/接收时对报文本身的抵赖

    • 发送方否认。比如发送方否认发送过这个报文,或否认发送报文的内容。
    • 接收方否认。比如接收方否认收到过这个报文,或否认接收报文的内容。

密码散列函数

在解决报文完整性的问题中,需要使用到一个非常重要的概念,就是密码散列函数。

密码散列函数(Cryptographic Hash Function):H(m)。

用H(m)来表示利用密码散列函数对报文m进行的散列运算。

作为密码散列函数,与我们一般性的散列函数,具有以下一些特征:

  • 散列算法公开

  • H(m)能够快速计算

  • 对任意长度报文进行多对一映射,均产生定长输出

  • 对于任意报文无法预知其散列值

  • 不同报文不能产生相同的散列值

  • 单向性:无法根据散列值倒推出报文

    • 即对于给定散列值h,无法计算找到满足h=H(m)的报文m
  • 抗弱碰撞性(Weak Collision Resistence-WCR)

    • 对于给定报文x,计算上不可能找到y且y不等于x,使用H(x) = H(y)
  • 抗强碰撞性(Strong Collision Resistence-SCR)

    • 在计算中,不可能找到任意两个不同报文x和y(x≠y),使得H(x) = H(y)。

密码散列函数对报文完整性的校验是至关重要的。

作为与一般性的散列函数的对比,我们来看一个例子。

在之前讲解IP协议中,会有一个16比特的checksum校验和来在接收端判断数据报是否有修改。在这种校验和的计算中,其实也具备散列函数的某些属性:

  • 多对一映射
  • 对于任意报文,产生固定长度的散列值(16-bit校验和)

但是它并不能作为密码散列函数,因为对于给定的报文及其散列值,很容易找到另一个具有相同散列值的不同报文。比如下面这个例子:

在这里插入图片描述

散列函数算法

通过上面的介绍可以看出,密码散列函数的要求是比较严格的,需要经过精心设计。目前,在网络安全领域,使用的比较常见的有以下两个函数:

  • MD5:被广泛应用的散列函数(RFC 1321)
    • 通过4个步骤,对任意长度的报文输入,计算输出128位的散列值。
    • MD5不是足够安全。在1996年,Dobbertin找到了两个不同的512-bit块,在MD5计算下产生了相同的散列值。
  • SHA-1(Secure Hash Algorithm)
    • 另一个相对更安全的散列函数
    • US标准
    • SHA-1要求输入消息长度<264
    • SHA-1的散列值为160位
    • 速度慢于MD5,安全性优于MD5

报文摘要

报文摘要实际上是利用上面的密码散列函数,作用于某一任意长度的报文m,得到一个固定长度的散列值,通常把这个散列值称为报文摘要(message digest),记为H(m)。

在这里插入图片描述

这个报文摘要对原报文来说,是具有非常重要的意义的。重要的意义在于,报文摘要可以作为报文m的数字指纹(fingerprint)。

报文认证

有了上面的基础概念后,接下来我们就着重讨论下如何实现报文完整性的认证。

简单方案

简单方案:报文+报文摘要—>扩展报文(m, H(M))

上述简单方案利用了密码散列函数和报文摘要来实现。实际上,就是在给对方发送报文时,利用密码散列函数根据该报文内容,计算出一个报文摘要。此时,发送的报文内容除了其本身原有内容外,还包含一个报文摘要。两者构造出一个扩展报文,发送给对方。

接收方在收到该扩展报文后,根据同样的密码散列函数,根据报文内容计算得到一个散列值,然后跟报文摘要进行比对。如果一致,说明报文在传输过程中没有被修改,如果不一致,则说明已经被修改。

整体的大致过程如下所示:

在这里插入图片描述

为了在报文认证中,除了确保报文在传输过程中没有发生过改变外,还要认证报文的发送方确实是指定的真实发送方,而不是第三方入侵者或伪造的(身份认证),还需要对上述方案进行改进。

报文认证码MAC

报文认证码MAC:(Message Authentication Code)

实现原理:

  • 引入了一个报文认证密码的概念
  • 此时,一个扩展报文(m, H(m+s))包括了:原始报文m + 认证密钥s + 密码散列函数H

在使用这种方案下,报文认证过程大致如下所示:

  • 发送端在发送报文中,利用密码散列函数H,对原始报文内容m和认证密码s(一般就是一个字符串或比特串)一起共同生成一个报文摘要H(m+s)。
  • 该报文摘要与原始报文一起构成一个扩展报文(m ,H(m,s))
  • 接收端收到该报文后,分离出原始报文和报文摘要两部分。
  • 对于原始报文,利用相同的密码散列函数和认证密钥s,得到一个散列值H(m,s)
  • 同样的,将该散列值与报文摘要的值比对,如果匹配,则报文完整性成功认证。否则,认证失败。

在这里插入图片描述

这里为什么就能够确认报文是来自指定的真实发送方,而不是伪造或第三方入侵者呢?因为,这里引入了密钥的概念,而这对密钥只有发送方和接收方所持有。由于密码散列函数的特殊性,只有该密钥才能生成相应的报文摘要,从而保证了报文认证的可靠性。

报文验证码MAC在一定程度上解决了报文完整性校验和身份认证问题,但是报文完整性里涉及的其他问题,还很难解决。比如,接收端在持有报文时,由于它有密码s,因此,它可以任意构造一个报文内容m’,并利用该密钥s生成相应的报文摘要,然后伪造说这是发送方发送的报文。这里的问题,就涉及到我们开篇报文完整性要求中说的,预防报文持有期被修改和预防抵赖。

为了解决这些问题,就需要引入我们接下来介绍的数字签名概念。

数字签名

上面我们最后说到,作为报文验证码MAC实际上有一些其他的报文完整性问题还未解决。比如,涉及到下面这些问题。

Q:如何解决下列与报文完整性相关的问题?

  • 否认:发送方不承认自己发送过某一报文。
  • 伪造:接收方自己伪造一份报文,并声称来自发送方
  • 冒充:某个用户冒充另一个用户接收后发送报文
  • 篡改:接收方对收到的信息进行篡改。

这些问题,简单依赖单一的报文认证码是很难解决的。目前比较有效的,也是在网络安全中使用比较广泛的解决方案,就是数字签名(Digital signatures)。

  • 数字签名技术是实现安全电子交易的核心技术之一。
  • 可验证性(verifiable),验证报文是否被修改过。
  • 不可伪造性(unforgeable)
  • 不可抵赖性(non-repudiation)

数字签名的简单实现原理

显然我们很容易想到,**签名的主要目的是为了预防修改,即签名本身是不能被修改的,被签名的内容是不能被修改的。**就跟我们日常生活中,对一个文件的签名,往往就是签上自己的姓名,甚至手印,而且要保存原件,就是为了签名后,签名和文件内容都是不能被修改的。

因此,与日常生活中的签名行为联系起来的话,网络安全中的数字签名技术,实际上就是在发送的报文(相当于文件),签上一个数字名称,这个名称保证了报文的完整性,同时也标识着身份认证。同时,这个签名一定是唯一特殊,不可被修改的,从而保证不可伪造和不可抵赖性。

因此,为了实现数字签名,就需要借助于上面介绍的加密技术。报文加密技术是数字签名的基础。

同时,对于加密技术,首先不能选取对称加密算法,因为对称加密算法接收和发送双方使用的是同一个密钥,也就是说接收方是可以利用这个密码对接收报文进行修改的,也就是我们上面说的报文验证码的问题。

因此,对于加密算法的算法一定需要选择非对称加密算法(公钥技术)。此时,假设Bob要想Alice发送带有数字签名的信息,就可以利用其私钥对报文m进行加密,创建签名报文,KB-(m)。

整体流程如下所示:

在这里插入图片描述

作为Alice,实际上接收了两份报文:一份是明文原始报文m,另一份是Bob用私钥加密的签名报文。之后,Alice的响应帧流程大致如下所示:

  • Alice利用Bob的公钥KB+解密KB-(m),并检验KB+(KB-(m))= m来证实报文m确实是由Bob签名的。

  • 如果KB+(KB-(m))= m成立,则签名m的一定是Bob的私钥

  • 于是:

    Alice可以证实:

    • Bob签名了m
    • 没有其他人签名m的可能
    • Bob签名的是报文m而不是其他报文m‘

    不可抵赖:

    • Alice可以持有报文m和签名KB-(m),必要是可以提交给法院证明是Bob签名的报文m。

实际上,通过上面的介绍我们细想就能发现,实际上报文验证码MAC和数字签名技术的实现区分,实际上也就是对称加密算法和非对称加密算法实现原理的区别。因为有了非对称加密算法,使得每个用户都可以保留自己的私钥,同时公开一个公钥来进行解密。而这个私钥就成了身份认证的唯一标识,比如身份证ID,或指纹。从而保证了报文传输过程中的消息完整性和身份认证。

签名报文摘要

上述简单数字签名的方案有一个较大的缺点,就是在利用私钥对报文加密后(签名后),该签名要跟着报文一起发送给接收端。一来,传输的报文量相当于是两倍的报文,造成信道资源消耗。二来,接收方在对签名解密时,原始报文往往比较大,解密速度也会比较慢。因此,可以设计一些方案来改进这个签名过程。

怎么做呢?可以联想到上面提到过的报文摘要,对于报文摘要来说,它可以作为报文的数字指纹这样一个特征,也就是可以唯一标识一个报文。换句话说,报文摘要其实就与原始报文一一对应。

因此,显而易见,我们在签名的时候可以不对整个原始报文进行签名,而改为对这个报文摘要进行签名,也可以实现同样的效果。

因此,目前大部分的数字签名,使用的都是报文摘要签名的方法。

接下来我们来看一下,利用报文摘要数字签名的实现流程:

Bob发送数字签名的报文:

  • Bob在发送报文时,利用密码散列函数,对报文生成报文摘要H(m)
  • Bob利用自己的私钥,对报文摘要进行签名,得到签名后的报文摘要:KB-(H(m))
  • 把该签名后的报文摘要和报文一起,组成扩展报文(m, KB-(H(m)))发送给接收端。

Alice核实签名以及数字签名报文的完整性:

  • Alice分离出原始报文本身,和签名报文摘要
  • Alice利用相同的密码散列函数,根据原始报文,生成报文摘要
  • 再利用Bob的公钥对签名报文摘要进行解密
  • 将解密后的报文摘要与刚刚生成的报文摘要进行比对,判断两者是否相同。

在这里插入图片描述

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

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

相关文章

C++模拟实现反向迭代器

1.代码实现 1.有了解正向迭代器的应该知道&#xff0c;比如list的正向迭代器其实本质是一个类&#xff0c;而有些人想模拟实现反向迭代器&#xff0c;依旧想再创建一个类&#xff0c;但是库里面想要的是&#xff0c;你给我一个迭代器&#xff0c;我就能给你反馈一个反向迭代器…

信号槽中的函数重载

信号槽中的函数重载 QT4的方式QT5的方式函数指针重载函数QT5信号函数重载解决方案 总结 QT4的方式 Qt4中声明槽函数必须要使用 slots 关键字, 不能省略。 信号函数&#xff1a; 槽函数&#xff1a; mainwondow: cpp文件&#xff1a; #include "mainwindow.h"…

C/C++多线程操作

文章目录 多线程C创建线程join 和detachthis_thread线程操作锁lock_guardunique_lock 条件变量 condition_variablewaitwaitfor C语言线程创建线程同步 参考 多线程 传统的C&#xff08;C11标准之前&#xff09;中并没有引入线程这个概念&#xff0c;在C11出来之前&#xff0c…

C语言:反转一个单链表

Lei宝啊&#xff1a;个人主页 题目&#xff1a; 描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 接口&#xff1a; struct ListNode* reverseList(struct ListNode* head){} 示例&#xff1a; 输入&#xff1a; head [1…

一起学算法(冒泡排序篇)

1.概念 冒泡排序&#xff08;Bubble Sort&#xff09;又称泡式排序&#xff0c;是一种简单的排序算法 核心思想&#xff1a;它重复地走访过要排列的次数&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来&#xff0c;走访数列的工作是重复地进行交…

【Datawhale夏令营】任务三学习笔记

任务一笔记回顾 任务二笔记回顾 目录 一&#xff1a;竞赛上分流程 1.1问题建模1.2数据分析 1.3数据清洗1.4特征工程 1.5模型训练与验证 二&#xff1a;任务总结与心得 一&#xff1a;竞赛上分流程 问题建模——>数据分析 ——>数据清洗——>特征工程——>模型…

ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000

leetcode上的一道题&#xff0c;当 s “a” 这样的单字符的时候&#xff0c;使用memset会出错&#xff0c;ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000。 有些奇怪&#xff0c; 记录一下&#xff0c;双字符以及以上的时候不会报错&#xff0c;

Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Spring注解开发 一、注解开发定义Bean二、纯注解开发Bean三…

MacOS Sonoma 14.0 (23A5301g) Beta4 带 OC 0.9.3 and FirPE 双分区原版黑苹果镜像

7月26日苹果发布macOS Sonoma Beta 4预览版更新&#xff0c;但部分用户在升级后遇到了各种问题。这一测试版目前还处于开发阶段&#xff0c;因此出现各种问题并不意外。 一、镜像下载&#xff1a; 1.微信公众号&#xff1a;MacOS Sonoma 14.0 (23A5301g) Beta4 带 OC 引导双分…

视频爬虫:解析m3u8文件 python m3u8库,m3u8文件中.ts视频流的解密下载

一、引用的库 这里需要引用的库是&#xff1a;from Crypto.Cipher import AES 有坑哈&#xff0c;python3.0之后直接安装crypto你会发现不管怎么着都会报错。 经过查找资料找到了原因&#xff0c;原来是20年之后crypto已经被pycryptohome替换掉啦&#xff0c; 如果之前安装过…

暴力破解(DVWA和pikachu)

目录 前言暴力破解模式一.pikachu靶场1.基于表单的暴力破解2. 验证码绕过2. token防爆破 二. DVWA1.low,Medium2.High3. Impossible 前言 渗透测试中暴力破解方法解释&#xff1a;通过尝试所有可能的字符组合来猜测密码的方法。 这种攻击方法需要大量计算资源和时间&#xff0…

人类文明进入下个纪元奇点:UFO听证会-恒温超导发现-GPT大模型

今年以来&#xff0c;科技领域出圈的事件频繁发生&#xff0c;每一个事件都意味着一个领域的重大突破的可能。这些事件是UFO听证会、恒温超导LK99的论文、GPT类大模型的广泛应用&#xff0c;我常将这些事件串在一起思考&#xff0c;细思极恐&#xff0c;一种”火鸡与农场主“的…

Vue(待续)

概念 一套用于构建用户界面的渐进式JavaScript框架 Vue可以自底向上逐层的应用&#xff1a; 简单应用:只需一个轻量小巧的核心库。 复杂应用:可以引入各式各样的Vue插件。 1.采用组件化模式&#xff0c;提高代码复用率、且让代码更好维护。 2.声明式编码&#xff0c;让编码人员…

使用Appuploader工具将IPA上传到App Store的最新流程和步骤

​ 苹果官方提供的工具xcode上架ipa非常复杂麻烦。用appuploader 可以在 mac 和windows 上制作管理 证书 &#xff0c;无需钥匙串工具 条件&#xff1a;1.以Windows为例&#xff0c;创建app打包ios需要的证书和描述文件 2.准备好一个苹果开发者账号&#xff08;如果没有到苹果…

C++ | unordered_map与unordered_set的用法指南

目录 前言 一、unordered_set 1、简介 2、构造相关函数 3、容量相关函数 4、修改与查找相关接口 5、迭代器 二、unordered_map 1、简介 2、构造相关函数 3、容量相关接口 4、迭代器、查找与修改相关接口 5、方括号接口 三、红黑树系列与哈希系列对比 前言 unorde…

SpringCloud(待续)

单体架构特点? 简单方便&#xff0c;高度耦合&#xff0c;扩展性差&#xff0c;适合小型项目。例如:学生管理系统 分布式架构特点? 松耦合&#xff0c;扩展性好&#xff0c;但架构复杂&#xff0c;难度大。适合大型互联网项目&#xff0c;例如:京东、淘宝 微服务:一种良好的分…

vue项目环境 搭建

1、安装nodejs 2、安装vue-cli, npm i -g vue/cli-init 3、初始化项目 vue init webpack test 4、运行 cd test npm run dev

【机器学习】西瓜书习题3.5Python编程实现线性判别分析,并给出西瓜数据集 3.0α上的结果

参考代码 结合自己的理解&#xff0c;添加注释。 代码 导入相关的库 import numpy as np import pandas as pd import matplotlib from matplotlib import pyplot as plt导入数据&#xff0c;进行数据处理和特征工程 得到数据集 D { ( x i , y i ) } i 1 m , y i ∈ { 0 ,…

python+opencv学习

1. 把所有绿色通道值变为0 import cv2 import numpy as npimgcv2.imread(2.jpg) #读取图片 img[:,:,1]0 #绿色通道变为0 cv2.imshow(图片,img) #显示图片 cv2.waitKey(0) #无限地显示窗口 人生建议&#xff0c;一定要买书来学习呀&#xff0c;不是说教程不好&#xff0c;而是书…

idea application.yml配置文件没有提示或读不到配置

1.首先确定你的resources文件夹正常且yml文件图表和下面一样 不一样的右键去设置 2.确保你已经缩进了且层级关系正常 3.如果以上都不是&#xff0c;先考虑删除.idea重开试试 4.以上解决不了就装以下两个插件解决