当前位置: 首页 > news >正文

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

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

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

报文完整性

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

报文完整性,也称为消息完整性(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的公钥对签名报文摘要进行解密
  • 将解密后的报文摘要与刚刚生成的报文摘要进行比对,判断两者是否相同。

在这里插入图片描述

相关文章:

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

哈工大计算机网络课程网络安全基本原理详解之&#xff1a;消息完整性与数字签名 这一小节&#xff0c;我们继续介绍网络完全中的另一个重要内容&#xff0c;就是消息完整性&#xff0c;也为后面的数字签名打下基础。 报文完整性 首先来看一下什么是报文完整性。 报文完整性…...

K8s:K8s 20个常用命令汇总

写在前面 博文内容为节译整理&#xff0c;用于温习理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃避方式&#xff0…...

DHCP防护原理

电脑刚连接到网络 是没有IP地址的 。 通过发送广播到DHCPO服务器。 DHCP服务器响应对应的 IP地址&#xff08;简要过程&#xff09;。 如果有人私自挂接WIFI&#xff0c;相当于DHCP服务器&#xff0c;但这个DHCP服务器是假的&#xff0c;就会引起电脑接入获取家用WIFI的地址&…...

leetcode2434. 使用机器人打印字典序最小的字符串 出栈顺序 贪心+栈

https://leetcode.cn/problems/using-a-robot-to-print-the-lexicographically-smallest-string/ 给你一个字符串 s 和一个机器人&#xff0c;机器人当前有一个空字符串 t 。执行以下操作之一&#xff0c;直到 s 和 t 都变成空字符串。请你返回纸上能写出的字典序最小的…...

【程序设计】一文讲解程序设计目标:高内聚,低耦合

前言 软件设计的目标是高内聚、低耦合。 如果代码是高耦合和低内聚的&#xff0c;就会出现修改一个逻辑&#xff0c;会导致多处代码要修改&#xff0c;可能影响到多个业务链路&#xff0c;这增加了出bug的业务风险&#xff0c;同时增加了测试回归的范围&#xff0c;导致研发成…...

nginx mirror代码分析

实现方式 mirror逻辑的工作阶段&#xff1a; ngx在log phase之后&#xff08;在ngx_http_free_request处调用&#xff09;已完成向client端返回response&#xff0c;在log phase之后完成close connection&#xff08;短链接&#xff09;&#xff0c;在该阶段处理mirror逻辑不…...

Python代理模式介绍、使用

一、Python代理模式介绍 Python代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式。在代理模式中&#xff0c;代理对象充当了另一个对象的占位符&#xff0c;以控制对该对象的访问。 代理对象和被代理对象实现了相同的接口&#xff0c;因此它们可以互相替代…...

《MySQL45讲》笔记—索引

索引 索引是为了提高数据查询效率&#xff0c;就像书的目录一样。如下图&#xff0c;索引和数据就是位于存储引擎中&#xff1a; 索引常见模型 哈希表 以键值对存储的数据结构。适用于只有等值查询的场景。 有序数组 在等值查询和范围查询场景中性能都特别优秀。但是有…...

Android usb host模式通信示例

当使用Android设备作为USB主机时&#xff0c;可以使用Android提供的USB API来进行USB通信。下面是一个简单的Android USB通信的示例。在这个示例中&#xff0c;我们将发送一条消息到连接的USB设备并从USB设备接收响应。 首先&#xff0c;在AndroidManifest.xml文件中添加以下权…...

开源Blazor UI组件库精选:让你的Blazor项目焕然一新!

今天给大家推荐一些开源、美观的Blazor UI组件库&#xff0c;这些优秀的开源框架和项目不仅能够帮助开发者们提高开发效率&#xff0c;还能够为他们的项目带来更加丰富的用户体验。 注&#xff1a;排名不分先后&#xff0c;都是十分优秀的开源框架和项目 ​Ant Design Blazor…...

MATLAB RANSAC圆柱体点云拟合 (28)

MATLAB RANSAC圆柱体点云拟合 (28) 一、算法介绍二、函数介绍三、算法实现四、效果展示一、算法介绍 RANSAC拟合方法,从原始点云中拟合具有特定形状的点云,这里对原始点云中大致呈圆柱的点云进行分割,圆柱的半径,以及朝向都是比较重要的定义圆柱的参数。下面是具体使用的…...

【AI】《动手学-深度学习-PyTorch版》笔记(七):自动微分

AI学习目录汇总 1、什么是自动微分 自动微分:automatic differentiation,深度学习框架通过自动计算导数,即自动微分,自动微分使系统能够随后反向传播梯度。 计算图:computational graph,根据设计好的模型,系统会构建一个计算图, 来跟踪计算是哪些数据通过哪些操作组合…...

vuejs源码阅读之代码生成器

代码生成器是模版编译的最后以后&#xff0c;它的作用是将AST转换成渲染函数中的内容&#xff0c;这个内容可以称为代码字符串。 代码字符串可以被包装在函数中执行&#xff0c;这个函数就是我们通常说的渲染函数。 渲染函数被执行之后&#xff0c;可以生成一份VNode&#xf…...

【MySQL】视图(十)

&#x1f697;MySQL学习第十站~ &#x1f6a9;本文已收录至专栏&#xff1a;MySQL通关路 ❤️文末附全文思维导图&#xff0c;感谢各位点赞收藏支持~ 一.引入 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据…...

面试手写实现Promise.all

目录 前言常见面试手写系列Promise.resolve 简要回顾源码实现Promise.reject 简要回顾源码实现Promise.all 简要回顾源码实现Promise.allSettled 简要回顾源码实现Promise.race 简单回顾源码实现结尾 前言 (?﹏?)曾经真实发生在一个朋友身上的真实事件&#xff0c;面试官让…...

TCP网络通信编程之字符流

【案例1】 【题目描述】 【 注意事项】 (3条消息) 节点流和处理流 字符处理流BufferedReader、BufferedWriter&#xff0c;字节处理流-BufferedInputStream和BufferedOutputStream (代码均正确且可运行_Studying~的博客-CSDN博客 1。这里需要使用字符处理流&#xff0c;来将…...

佰维存储面向旗舰智能手机推出UFS3.1高速闪存

手机“性能铁三角”——SoC、运行内存、闪存决定了一款手机的用户体验和定位&#xff0c;其中存储器性能和容量对用户体验的影响越来越大。 针对旗舰智能手机&#xff0c;佰维推出了UFS3.1高速闪存&#xff0c;写入速度最高可达1800MB/s&#xff0c;是上一代通用闪存存储的4倍以…...

降龙十八掌

目录 大数据&#xff1a; 1 HIVE&#xff1a; 1.1 HIVE QL 1.1.1 创建表 1.1.2 更新表 1.1.3 常用语句 1.2 hive参数配置 大数据&#xff1a; 1 HIVE&#xff1a; 1.1 HIVE QL DDL中常用的命令有&#xff1a;create&#xff0c;drop&#xff0c;alter&#xff0c;trunc…...

【项目设计】MySQL 连接池的设计

目录 &#x1f449;关键技术点&#x1f448;&#x1f449;项目背景&#x1f448;&#x1f449;连接池功能点介绍&#x1f448;&#x1f449;MySQL Server 参数介绍&#x1f448;&#x1f449;功能实现设计&#x1f448;&#x1f449;开发平台选型&#x1f448;&#x1f449;MyS…...

Ubuntu系统adb开发调试问题记录

Ubuntu系统adb开发调试问题记录 一、adb devices no permissions二、自定义adb server端口三、动态库目录四、USB抓包 一、adb devices no permissions lsusb -t 设备树直观地查看设备的Bus ID和Device Num&#xff0c;lsusb找到对应的PID和VID编辑udev规则 sudo vim /etc/ud…...

【宏定义】——检验条件是否成立,并返回指定的值

文章目录 功能说明实现示例解析扩展 功能说明 宏检验条件是否成立&#xff0c;并返回指定的值 #define TU_VERIFY(...) _GET_3RD_ARG(__VA_ARGS__, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(__VA_ARGS__)TU_VERIFY(1) 检验为真&#xff0c;啥也不干TU_VERIFY(0) 校验为假&…...

UE5引擎源码小记 —反射信息注册过程

序 最近看了看反射相关的知识&#xff0c;用不说一点人话的方式来说&#xff0c;反射是程序在运行中能够动态获取修改或调用自身属性的东西。 一开始我是觉得反射用处好像不大&#xff0c;后续查了下一些反射的使用环境&#xff0c;发现我格局小了&#xff0c;我觉得用处不大的…...

Redis缓存预热

说明&#xff1a;项目中使用到Redis&#xff0c;正常情况&#xff0c;我们会在用户首次查询数据的同时把该数据按照一定命名规则&#xff0c;存储到Redis中&#xff0c;称为冷启动&#xff08;如下图&#xff09;&#xff0c;这种方式在一些情况下可能会给数据库带来较大的压力…...

Android 耗时分析(adb shell/Studio CPU Profiler/插桩Trace API)

1.adb logcat 查看冷启动时间和Activity显示时间&#xff1a; 过滤Displayed关键字&#xff0c;可看到Activity的显示时间 那上面display后面的是时间是指包含哪些过程的时间呢&#xff1f; 模拟在Application中沉睡1秒操作&#xff0c;冷启动情况下&#xff1a; 从上可知&…...

保护隐私与安全的防关联、多开浏览器

随着互联网的不断发展&#xff0c;我们越来越离不开浏览器这个工具&#xff0c;它为我们提供了便捷的网络浏览体验。然而&#xff0c;随着我们在互联网上的活动越来越多&#xff0c;我们的个人信息和隐私也日益暴露在网络风险之下。在这种背景下&#xff0c;为了保护个人隐私和…...

CloudStudio搭建Next框架博客_抛开电脑性能在云端编程(沉浸式体验)

文章目录 ⭐前言⭐进入cloud studio工作区指引&#x1f496; 注册coding账号&#x1f496; 选择cloud studio&#x1f496; cloud studio选择next.js&#x1f496; 安装react的ui框架&#xff08;tDesign&#xff09;&#x1f496; 安装axios&#x1f496; 代理请求跨域&#x…...

【FPGA IP系列】FIFO深度计算详解

FIFO(First In First Out)是一种先进先出的存储结构&#xff0c;经常被用来在FPGA设计中进行数据缓存或者匹配传输速率。 FIFO的一个关键参数是其深度&#xff0c;也就是FIFO能够存储的数据条数&#xff0c;深度设计的合理&#xff0c;可以防止数据溢出&#xff0c;也可以节省…...

JavaScript中语句和表达式

在JavaScript编程中&#xff0c;Statements和Expressions都是代码的构建块&#xff0c;但它们有不同的特点和用途。 ● Statements&#xff08;语句&#xff09;是执行某些操作的完整命令&#xff1b;每个语句通常以分号结束。例如&#xff0c;if语句、for语句、switch语句、函…...

打卡力扣题目十

#左耳听风 ARST 打卡活动重启# 目录 一、题目 二、解决方法一 三、解决方法二 关于 ARTS 的释义 —— 每周完成一个 ARTS&#xff1a; ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Shar…...

UniApp实现API接口封装与请求方法的设计与开发方法

UniApp实现API接口封装与请求方法的设计与开发方法 导语&#xff1a;UniApp是一个基于Vue.js的跨平台开发框架&#xff0c;可以同时开发iOS、Android和H5应用。在UniApp中&#xff0c;实现API接口封装与请求方法的设计与开发是一个十分重要的部分。本文将介绍如何使用UniApp实…...