计算机网络安全 —— 报文摘要算法 ME5 (三)
一、报文摘要算法基本概念
使用加密通常可达到报文鉴别的目的,因为伪造的报文解密后一般不能得到可理解的内容。但简单采用这种方法,计算机很难自动识别报文是否被篡改。另外,对于不需要保密而只需要报文鉴别的网络应用,对整个报文的加密和解密,会使计算机增加很多不必要的负担(加密和解密要花费相当多的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.md5
6 {
7 public class Md5Util
8 {
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 }

代码示例:https://github.com/Dwayne112401/encryption
计算机网络安全 —— 报文摘要算法 ME5 (三)的更多相关文章
- 计算机网络安全 —— 非对称加密算法 RSA 和数字签名(二)
一.非对称加密算法基本概念 在对称密钥系统中,两个参与者要共享同一个秘密密钥.但怎样才能做到这一点呢?一种是事先约定,另一种是用信使来传送.在高度自动化的大型计算机网络中,用信使来传送密钥显然是不合适 ...
- 计算机图形学 opengl版本 第三版------胡事民 第四章 图形学中的向量工具
计算机图形学 opengl版本 第三版------胡事民 第四章 图形学中的向量工具 一 基础 1:向量分析和变换 两个工具 可以设计出各种几何对象 点和向量基于坐标系定义 拇指指向z轴正 ...
- TCP报文格式和三次握手——三次握手三个tcp包(header+data),此外,TCP 报文段中的数据部分是可选的,在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。
from:https://blog.csdn.net/mary19920410/article/details/58030147 TCP报文是TCP层传输的数据单元,也叫报文段. 1.端口号:用来标识 ...
- 计算机基础理论知识梳理篇(三):VLAN与VLAN网卡相关概念
VLAN(Virtual Local Area Network) 虚拟局域网(VLAN,802.1Q)是一组逻辑上的设备和用户,这些设备和用户并不受物理位置的限制,可以根据功能.部门及应用等因素将它们 ...
- 计算机图形学 opengl版本 第三版------胡事民 第三章更多的绘图工具
opengl 计算机图形学 第三版 第二部分 第三章更多的绘图工具 3.1 概述 第2章中 我们绘图使用的是屏幕窗口的基础坐标系 以像素为单位 屏幕坐标从左下角x从0延伸到scr ...
- 计算机网络安全 —— 对称加密算法 DES
一.对称加密算法概念 我们通过计算机网络传输数据时,如果无法防止他人窃听, 可以利用密码学技术将发送的数据变换成对任何不知道如何做逆变换人都不可理解的形式, 从而保证了数据的机密性.这种变换被称为加密 ...
- RobotFrameWork接口报文测试-----(三)demo的加强版(数据驱动测试)
在上一篇RobotFrameWork接口报文测试-----(二)demo的升级版基础上,将接口的xml的格式保存在xml文件中,然后程序如果增加一个接口,在xml文件里添加即可,无需修改自动化测试里的 ...
- java socket报文通信(三)java对象和xml格式文件的相互转换
前两节讲了socket服务端,客户端的建立以及报文的封装.今天就来讲一下java对象和xml格式文件的相互转换. 上一节中我们列举了一个报文格式,其实我们可以理解为其实就是一个字符串.但是我们不可能每 ...
- 《11招玩转网络安全》之第三招:Web暴力破解-Low级别
Docker中启动LocalDVWA容器,准备DVWA环境.在浏览器地址栏输入http://127.0.0.1,中打开DVWA靶机.自动跳转到了http://127.0.0.1/login.php登录 ...
随机推荐
- 小白都能理解的Python多继承
本文主要做科普用,在真实编程中不建议使用多重继承,或者少用多重继承,避免使代码难以理解. 方法解析顺序(MRO) 关于多重继承,比较重要的是它的方法解析顺序(可以理解为类的搜索顺序),即MRO.这个跟 ...
- java基础:详解类和对象,类和对象的应用,封装思想,构造方法详解,附练习案列
1. 类和对象 面向对象和面向过程的思想对比 : 面向过程 :是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的 面向对象 :是一种以对象为中心的编程思想,通过指挥对象实现具体的功能 1. ...
- CentOS8 部署SqlServer
官方文档https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-red-hat?view=sql-server-li ...
- 4.mysql profile的使用方法
profile的使用 1.作用 使用profile可以对某一条sql性能进行分析 2.语法 mysql> show variables like '%profil%'; +----------- ...
- Java学习_Java快速入门
Java简介 安装完JDK后,需要设置一个JAVA_HOME的环境变量,它指向JDK的安装目录.在Windows下,它是安装目录,类似: C:\Program Files\Java\jdk-15 把J ...
- Java日常开发的21个坑,你踩过几个?
前言 最近看了极客时间的<Java业务开发常见错误100例>,再结合平时踩的一些代码坑,写写总结,希望对大家有帮助,感谢阅读~ 1. 六类典型空指针问题 包装类型的空指针问题 级联调用的空 ...
- MySQL - 数据查询 - 简单查询
1. 简述 查询数据是指从数据库中获取所需要的数据.如Jack 要达到验证用户名和密码的目的,就需要从数据库已保存的用户表中读取当前用户的密码进行验证,以验明正身!保存查询数据是数据库操作中常用且重要 ...
- vue+element对常用表格的简单封装
在后台管理和中台项目中, table是使用率是特别的高的, 虽然element已经有table组件, 但是分页和其他各项操作还是要写一堆的代码, 所以就在原有的基础上做了进一步的封装 所涵盖的功能有: ...
- SQLServer多事务——事务嵌套
在ERP中,偶尔会有存储过程里面继续调用存储过程的情况 其中更有一些特殊的存储过程分别都使用了存储过程,大致可以分为下面几种情况: 1.平行事务,在多个事务中,任意一个成功则提交数据库,失败则各自RO ...
- 磁盘IO工作机制
磁盘IO工作机制 ref: <深入分析java web 技术内幕> by:许令波 几种访问文件的方式 文件读取和写入的 IO 操作都是调用操作系统提供的接口,因为磁盘设备是由操作系统管理的 ...