【MD5知识详解】【面试知识】

在这里插入图片描述

MD5概述:

MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要(32位的数字字母混合码)。

MD5主要特点:

  • 不可逆,相同数据的MD5值肯定一样,不同数据的MD5值不一样

(一个MD5理论上的确是可能对应无数多个原文的,因为MD5是有限多个的而原文可以是无数多个。比如主流使用的MD5将任意长度的“字节串映射为一个128bit的大整数。也就是一共有2128种可能,大概是 3.4*1038,这个数字是有限多个的,而但是世界上可以被用来加密的原文则会有无数的可能性)

MD5的性质:

  • 容易计算:从原数据计算出MD5值很容易。
  • 压缩性:任意长度的数据,算出的MD5值长度都是固定的(相当于超损压缩)。
  • 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
  • 弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
  • 强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。

MD5是否可以被破解

但是由于某些MD5破解网站,专门用来查询MD5码,其通过把常用的密码先MD5处理,并将数据存储起来,然后跟需要查询的MD5结果匹配,这时就有可能通过匹配的MD5得到明文,所以有些简单的MD5码是反查到加密前原文的。对于简单的暴力破解一定程度可以行

MD5用途:

  1. 防止被篡改:

比如发送一个电子文档,发送前,我先得到MD5的输出结果a。然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。如果a与b一样就代表中途未被篡改。

比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的MD5输出结果。

SVN在检测文件是否在CheckOut后被修改过,也是用到了MD5.

  1. 防止直接看到明文:

现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码。(比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。).

3.防止抵赖(数字签名):

这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。

算法原理

MD5算法原理

C# 实现字符串MD5加密

 public static string ToMD5(string Text)
 {
     byte[] buffer = System.Text.Encoding.UTF8.GetBytes(Text);
     try
     {
         //官方不推荐使用该方法
         //System.Security.Cryptography.MD5CryptoServiceProvider check;
         //check = new System.Security.Cryptography.MD5CryptoServiceProvider();
         //check.ComputeHash(buffer);

         //128位
         //MD5 md5 = System.Security.Cryptography.MD5.Create();
         //256位
         //SHA256 md5 = System.Security.Cryptography.SHA256.Create();
         //512位
         SHA512 md5 = System.Security.Cryptography.SHA512.Create();
         byte[] somme = md5.ComputeHash(buffer);
         string ret = "";

         foreach (byte a in somme)
         {
             if (a < 16)
                 ret += "0" + a.ToString("X");
             else
                 ret += a.ToString("X");//转成16进制数
         }
         return ret.ToLower();
     }
     catch
     {
         throw;
     }
 }

三种情况输出结果

在这里插入图片描述

额外知识

  • UTF-8字符集,一个汉字占三个字节,
  • 1字节(Byte)=8字位=8个二进制数
  • 1字位(bit)=1个二进制数

不同编码对应字节数

英文字母
字节数 : 1;  编码:GB2312
字节数 : 1;  编码:GBK
字节数 : 1;  编码:GB18030
字节数 : 1;  编码:ISO-8859-1
字节数 : 1;  编码:UTF-8
字节数 : 4;  编码:UTF-16
字节数 : 2;  编码:UTF-16BE
字节数 : 2;  编码:UTF-16LE
中文汉字:
字节数 : 2;  编码:GB2312
字节数 : 2;  编码:GBK
字节数 : 2;  编码:GB18030
字节数 : 1;  编码:ISO-8859-1
字节数 : 3;  编码:UTF-8
字节数 : 4;  编码:UTF-16
字节数 : 2;  编码:UTF-16BE
字节数 : 2;  编码:UTF-16LE

参考链接

字节知识点
MD5原理
字符集介绍
UTF-8字符对照表
MD5官方解释

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是小狼君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值