计算机网络安全 —— 报文摘要算法 MD5
一、报文摘要算法基本概念
使用加密通常可达到报文鉴别的目的,因为伪造的报文解密后一般不能得到可理解的内容。但简单采用这种方法,计算机很难自动识别报文是否被篡改。另外,对于不需要保密而只需要报文鉴别的网络应用,对整个报文的加密和解密,会使计算机增加很多不必要的负担(加密和解密要花费相当多的CPU时间)。
更有效的方法是使用报文摘要(MessageDigest,MD)来进行报文鉴别。
发送方将可变 长度的报文m经过报文摘要算法运算后,得出固定长度的报文摘要H(m)。然后对H(m)进行加密,得出EK(H(m)),并将其附加在报文m后面发送出去。接收方把EK(H(m))解密还原为H(m),再把收到的报文进行报文摘要运算,看结果是否与收到的H(m)一样。如不一样,则可断定收到的报文不是发送方产生的。具体流程如下:

目前广泛应用的报文摘要算法有MD5[RFC1321]和安全散列算法1(SecureHashAlgorithm,SHA-1)。MD5输出128位的摘要,SHA-1输出160位的摘要。SHA-1比MD5更安全些,但计算起来比MD5要慢。
二、.NET 使用 MD5、SHA1、SHA128、SHA512 报文摘要算法
1 using System;2 using System.Security.Cryptography;3 using System.Text;4 5 namespace encryption.md56 {7 public class Md5Util8 {9 public enum MD
10 {
11 MD5,
12 SHA1,
13 SHA256,
14 SHA512,
15 }
16 private static HashAlgorithm CreateHashAlgorithm(MD sha)
17 {
18 switch (sha)
19 {
20 case MD.MD5:
21 return new MD5CryptoServiceProvider();
22 case MD.SHA1:
23 return SHA1.Create();
24 case MD.SHA256:
25 return SHA256.Create();
26 case MD.SHA512:
27 return SHA512.Create();
28 }
29
30 throw new Exception($"The type does not exits,type:{sha}");
31 }
32
33 /// <summary>
34 /// 获取指定byte数组的MD5
35 /// </summary>
36 /// <param name="source"></param>
37 /// <param name="encoding"><see cref="Encoding"/>默认值:UTF8</param>
38 /// <returns></returns>
39 public static byte[] GetMD5(byte[] source, MD sha=MD.MD5, Encoding encoding = null)
40 {
41 byte[] output = CreateHashAlgorithm(sha).ComputeHash(source);
42 return output;
43 }
44
45 /// <summary>
46 /// 获取指定字符串的MD5
47 /// </summary>
48 /// <param name="source"></param>
49 /// <param name="encoding"><see cref="Encoding"/>默认值:UTF8</param>
50 /// <returns></returns>
51 public static byte[] GetMD5(string source, MD sha = MD.MD5, Encoding encoding = null)
52 {
53 if (encoding == null) encoding = Encoding.UTF8;
54 return GetMD5(encoding.GetBytes(source), sha, encoding);
55 }
56
57
58 /// <summary>
59 /// MD5 校验
60 /// </summary>
61 /// <param name="input">校验二进制</param>
62 /// <param name="hash">待比较的MD5 值</param>
63 /// <param name="encoding"></param>
64 /// <returns>true:相同;false:被纂改</returns>
65 public static bool VerifyMD5(byte[] input, byte[] hash, MD sha = MD.MD5, Encoding encoding = null)
66 {
67 if (encoding == null) encoding = Encoding.UTF8;
68 var buffer = GetMD5(input, sha,encoding);
69 if (Convert.ToBase64String(buffer) == Convert.ToBase64String(hash))
70 {
71 return true;
72 }
73 return false;
74 }
75
76 /// <summary>
77 /// MD5 校验
78 /// </summary>
79 /// <param name="input">校验字符串</param>
80 /// <param name="hash">待比较的MD5 值</param>
81 /// <param name="encoding"></param>
82 /// <returns>true:相同;false:被纂改</returns>
83 public static bool VerifyMD5(string input, byte[] hash, MD sha = MD.MD5, Encoding encoding = null)
84 {
85 if (encoding == null) encoding = Encoding.UTF8;
86 return VerifyMD5(encoding.GetBytes(input), hash, sha,encoding);
87 }
88 }
89 }
三、测试代码与结果
1 static void Main()2 {3 {4 Console.WriteLine("-----------------------------------------------------生成MD5--------------------------------------------------");5 var input = "目前广泛应用的报文摘要算法有MD5[RFC1321]和安全散列算法1(SecureHashAlgorithm,SHA-1)。";6 Console.WriteLine($"内容:{input}");7 byte[] md5 = Md5Util.GetMD5(input);8 Console.WriteLine($"MD5:{Convert.ToBase64String(md5)}");9 }
10
11 {
12 Console.WriteLine("-----------------------------------------------------MD5防篡改校验--------------------------------------------------");
13 var input = "https://docs.microsoft.com/zh-tw/dotnet/api/system.security.cryptography.md5?view=net-5.0";
14 Console.WriteLine($"内容:{input}");
15 byte[] md5 = Md5Util.GetMD5(input+"不一致");
16 Console.WriteLine($"MD5校验:{Md5Util.VerifyMD5(input, md5)}");
17 }
18
19 {
20 Console.WriteLine("-----------------------------------------------------生成SHA512--------------------------------------------------");
21 var input = "目前广泛应用的报文摘要算法有MD5[RFC1321]和安全散列算法1(SecureHashAlgorithm,SHA-1)。";
22 Console.WriteLine($"内容:{input}");
23 byte[] md5 = Md5Util.GetMD5(input,Md5Util.MD.SHA512);
24 Console.WriteLine($"SHA512:{Convert.ToBase64String(md5)}");
25 }
26
27 {
28 Console.WriteLine("-----------------------------------------------------SHA512防篡改校验--------------------------------------------------");
29 var input = "https://docs.microsoft.com/zh-tw/dotnet/api/system.security.cryptography.md5?view=net-5.0";
30 Console.WriteLine($"内容:{input}");
31 byte[] md5 = Md5Util.GetMD5(input, Md5Util.MD.SHA512);
32 Console.WriteLine($"SHA512校验:{Md5Util.VerifyMD5(input, md5, Md5Util.MD.SHA512)}");
33 }
34
35 Console.ReadKey();
36 }

相关文章:
计算机网络安全 —— 报文摘要算法 MD5
一、报文摘要算法基本概念 使用加密通常可达到报文鉴别的目的,因为伪造的报文解密后一般不能得到可理解的内容。但简单采用这种方法,计算机很难自动识别报文是否被篡改。另外,对于不需要保密而只需要报文鉴别的网络应用,对整个…...
LeetCode 746. 使用最小花费爬楼梯 java题解
https://leetcode.cn/problems/min-cost-climbing-stairs/description/ 优化:可以不用dp数组,用变量,节省空间。 class Solution {public int minCostClimbingStairs(int[] cost) {int lencost.length;int[] dpnew int[len1];dp[0]0;//爬到0…...
Kubernetes的pod控制器
文章目录 一,什么是pod控制器二,pod控制器类型(重点)1.ReplicaSet2.Deployment3.DaemonSet4.StatefulSet5.Job6.Cronjob 三,pod与控制器的关系1.Deployment2.SatefulSet2.1StatefulSet组成2.2headless的由来2.3有状态服…...
ArcMap 处理栅格数据地形图配准操作
ArcMap 处理栅格数据地形图配准操作今天分享 一、地形图配准 1、绘图 点击 开始绘制,四条线 2、地理配准 1)点击弹出 2)画控制点 关闭自动校正 画线 从焦点向外划线,然后邮件输入坐标弹出框,填写相应内容,…...
comprehension
1.读题---猜---文章主题 只读题目,不读选项 2.文章--定位 3.用文章对应选项 1 be based on be dependent upon 2 fruitful adj.富有成效的;硕果累累的; 3 unfruitful adj.徒然的,无益的,没有结果的 4 desperately adv.拼命地&#x…...
开源宝藏:Smart-Admin 重复提交防护的 AOP 切面实现详解
首先,说下重复提交问题,基本上解决方案,核心都是根据URL、参数、token等,有一个唯一值检验是否重复提交。 而下面这个是根据用户id,唯一值进行判定,使用两种缓存方式,redis和caffeineÿ…...
使用 npm 安装 Electron 作为开发依赖
好的,下面是一个使用 npm pack 和 npm install 命令来打包和安装离线版本的 npm 包的具体示例。我们将以 electron 为例,演示如何在有网络连接的机器上打包 electron,然后在没有网络连接的机器上安装它。 步骤 1: 在有网络连接的机器上打包 …...
JavaWeb之综合案例
前言 这一节讲一个案例 1. 环境搭建 然后就是把这些数据全部用到sql语句中执行 2.查询所有-后台&前台 我们先写后台代码 2.1 后台 2.2 Dao BrandMapper: 注意因为数据库里面的名称是下划线分割的,我们类里面是驼峰的,所以要映射 …...
MySQL 报错:1137 - Can‘t reopen table
MySQL 报错:1137 - Can’t reopen table 1. 问题 对临时表查询: select a.ts_code,a.tsnum,b.tsnum from (select t.ts_code ,count(*) tsnum from tmp_table t group by t.ts_code having count(*) > 20 and count(*)< 50 ) a ,(select t.ts_…...
Claude3.5-Sonnet和GPT-4o怎么选(附使用链接)
随着人工智能模型的不断进化,传统的评估标准已经逐渐变得陈旧和不再适用。以经典的“喝水测试”为例,过去广泛应用于检测模型能力,但现如今即便是国内的一些先进模型,也能够轻松答对这些简单的问题。因此,我们亟需引入…...
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
在网上找了很多种办法 都解决不了; 最后发现是文本域字体设置出了问题; 在这不展示其他的代码 只展示重要代码; 1 引入扩展包 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</v…...
java-贪心算法
1. 霍夫曼编码(Huffman Coding) 描述: 霍夫曼编码是一种使用变长编码表对数据进行编码的算法,由David A. Huffman在1952年发明。它是一种贪心算法,用于数据压缩。霍夫曼编码通过构建一个二叉树(霍夫曼树&a…...
OpenCV和Qt坐标系不一致问题
“ OpenCV和QT坐标系导致绘图精度下降问题。” OpenCV和Qt常用的坐标系都是笛卡尔坐标系,但是细微处有些不同。 01 — OpenCV坐标系 OpenCV是图像处理库,是以图像像素为一个坐标位置,即一个像素对应一个坐标,所以其坐标系也叫图像…...
前端VUE项目启动方式
将VUE项目的前端项目运行起来,整个过程非常简单,预计5分钟就可以完成,取决于大家的网速。 项目运行先安装Node.js Windows 安装 Node.js 指南:http://www.iocoder.cn/NodeJS/windows-install(opens new window) Mac 安装 Node.js…...
Python小白学习教程从入门到入坑------习题课5(基础巩固)
目录 实战题 1、“千年虫”是什么虫? 2、模拟京东购物流程 3、模拟12306火车票订票流程 4、模拟手机通讯录 实战题 1、“千年虫”是什么虫? 要求:已知一个列表中存储的是员工的出生年份 [88,89,90,98,00,99] 由于时间比较久,出生的年份均为2位整数…...
飞凌嵌入式T113-i开发板RISC-V核的实时应用方案
随着市场对嵌入式设备的功能需求越来越高,集成了嵌入式处理器和实时处理器的主控方案日益增多,以便更好地平衡性能与效率——实时核负责高实时性任务,A核处理复杂任务,两核间需实时交换数据。然而在数据传输方面,传统串…...
基于Java后台实现百度、高德和WGS84坐标的转换实战
目录 前言 一、需求的缘由 1、百度坐标拾取 2、高德坐标拾取 3、不同地图的坐标展示 二、后端坐标偏移转换处理 1、相关类库介绍 2、coordtransorm类图介绍 3、后台实际转换 三、总结 前言 在当今数字化时代,地理位置信息的精确性和实时性对于各种应用至…...
SQL,力扣题目1635,Hopper 公司查询 I
一、力扣链接 LeetCode_1635 二、题目描述 表: Drivers ---------------------- | Column Name | Type | ---------------------- | driver_id | int | | join_date | date | ---------------------- driver_id 是该表的主键(具有唯一值的列)。 该表的每一行…...
Android 分区相关介绍
目录 一、MTK平台 1、MTK平台分区表配置 2、MTK平台刷机配置表 3、MTK平台分区表配置不生效 4、Super分区的研究 1)Super partition layout 2)Block device table 二、高通平台 三、展锐平台 四、相关案例 1、Super分区不够导致编译报错 经验…...
JMeter监听器与压测监控之 InfluxDB
1. 简介 在本文中,我们将介绍如何在 Kali Linux 上通过 Docker 安装 InfluxDB,并使用 JMeter 对其进行性能监控。InfluxDB 是一个高性能的时序数据库,而 JMeter 是一个开源的性能测试工具,可以用于对各种服务进行负载测试和性能监…...
STM32G030C8T6多通道ADC采集避坑指南:从时钟配置到采样周期,新手常犯的5个错误
STM32G030C8T6多通道ADC采集实战避坑指南:从原理到代码的完整解决方案 第一次接触STM32G030C8T6的多通道ADC采集时,我按照网上的教程配置完参数,却发现采集到的数据要么全是0,要么数值跳变严重。经过整整两天的调试和查阅参考手册…...
降AI率低至2%:SpeedAI科研小助手,论文过审省心利器
很多同学都在找能稳定过AIGC检测的工具,其实从 99.8% 到 14.9%:Paperxie AI 降重,破解论文 AIGC 检测的终极方案-CSDN博客这类分享里提到的核心需求,SpeedAI科研小助手都能更好地满足。一、写在前面:被AIGC检测支配的论…...
ChilloutMix NiPrunedFp32Fix 模型完整教程:从零开始掌握AI图像生成
ChilloutMix NiPrunedFp32Fix 模型完整教程:从零开始掌握AI图像生成 【免费下载链接】chilloutmix_NiPrunedFp32Fix 项目地址: https://ai.gitcode.com/hf_mirrors/emilianJR/chilloutmix_NiPrunedFp32Fix ChilloutMix NiPrunedFp32Fix 是一款基于稳定扩散技…...
[MediaForge] 音频技术深度解析(五):常见问题与快速解决
目录 问题排查方法论 音频采集常见问题 音频重采样常见问题 音频编码常见问题 音频封装常见问题 端到端完整流程问题 快速定位工具集 AI 辅助排查指南 1. 问题排查方法论 1.1 通用排查流程 ┌───────────────────────────────────────…...
考虑浆液黏度时变性与重力效应的注浆压力作用下隧道围岩变形的流固耦合动态分析模型 基于6.1版本...
考虑浆液黏度时变性与重力效应的注浆压力作用下隧道围岩变形的流固耦合动态分析模型 基于6.1版本 可视化结果:位移大小(时间、应力不同而不同)、应力分布、 打开COMSOL 6.1新建模型时,突然发现隧道注浆模拟要考虑浆液黏度的时间变…...
【AI工具】openclaw+离线模型
一、安装 1. 先换系统 apt 国内源(阿里云) # 1. 备份原来的源列表(重要!) sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak# 2. 执行替换,换成清华源 sudo sed -i s/archive.ubuntu.com/mirror…...
【ABAP】客转供 客户转供应商 cl_md_bp_maintain=>maintain 创建供应商
报错:未分配客户/供应商,您无法传输客户/供应商数据 这是因为如果创建的时候是作为客户的, 后面想要创建为供应商,所以调用的供应商创建/修改接口。 但是这时候,LFA1里面是没有供应商编号的,只有BUT000里面…...
层叠与优先级介绍
层叠 层叠是 CSS 的核心机制,用于解决同一元素同一属性被多个样式声明设置时的冲突问题。浏览器按照严格的优先级规则,从低到高逐层比较,最终确定哪个声明生效。 术语解释 名次 解释 有三种层叠来源类型 用户代理样式表、用户样式表和作…...
用 AI 做鸿蒙游戏 NPC,是一种什么体验?
子玥酱 (掘金 / 知乎 / CSDN / 简书 同名) 大家好,我是 子玥酱,一名长期深耕在一线的前端程序媛 👩💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚…...
RexUniNLU部署教程:Kubernetes集群中水平扩缩容RexUniNLU服务的Helm Chart实践
RexUniNLU部署教程:Kubernetes集群中水平扩缩容RexUniNLU服务的Helm Chart实践 1. 为什么需要在K8s中部署RexUniNLU? 你可能已经试过在本地跑通 python test.py,也成功启动了 server.py 提供的 FastAPI 接口。但当真实业务流量进来——比如…...
