其他

什么是MD5?

1.什么是MD5?


MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value)1,用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

MD5(消息摘要算法)散列算法是一种单向加密函数,它接受任意长度的消息作为输入,并返回一个固定长度的摘要值作为输出,用于验证原始消息。

MD5散列函数最初设计为用作验证数字签名的安全加密散列算法。但是MD5已被弃用,除了用作验证数据完整性和检测意外数据损坏的非加密校验和以外的用途。

通俗来说,MD5就相当于一个文件的身份证号码,与文件自身是绑定在一起的。当文件内容不变。MD5值就不会变。当文件内容改变时。MD5值也随之改变。所以MD5值可以用来识别文件是否完整。

有时候有些网站封禁文件就是靠MD5这类值来封禁数据的,在发现一个文件违规后,会采集该文件的值,然后去匹配其他文件。从而封禁所有违规文件。有很多可以改MD5值的软件。百度一下就有一大堆。并不是只有MD5值一种值来识别。还是有其他很多类型的改完后就和文件绑定一起了。

2.md5有什么作用?


一些朋友不是很了解md5是什么,其实,在计算机安全领域,md5是使用比较广泛的一种散列函数,用来保护信息传输的完整性。那么,md5有什么作用呢?下面本文针对md5是什么,以及md5的作用做个简单的介绍。

md5是一种信息摘要算法,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值,用来确保信息传输完整一致性。

  • 作用一:数字签名

MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,我将这段话“md5是什么,md5的这些用途你都知道吗”写在一个叫 read.txt文件中,并对这个read.txt产生一个MD5的值(密文:7a1189ca1650ef630a6c2b0206f42d8b)并记录在案,然后我可以传播这个文件给别人,别人如果修改了文件中的任何内容,那么我对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。

  • 作用二:一致性验证

MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,在Unix下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:

MD5 (tanajiya.tar.gz) = 38b8c2c1093dd0fec383a9d9ac940515

MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。

  • 作用三:安全访问认证

MD5还广泛用于操作系统的登录认证上,如Unix、各类BSD系统登录密码、数字签名等诸多方面。如在Unix系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。

3.MD5真的安全么?


了解MD5的都知道,它是不可能逆的,即我们没办法把MD5码还原对应的原文。道理很简单,任意长度的数据经过MD5处理后,所包含的信息量已经大大减少。要是可以还原的话,那MD5岂不是成为压缩算法??所以这里就会给很多人造成误解,以为不可逆就是不可破解,的确,复杂些的密码在一些MD5在线破解网站是破解不了的,相对来说是安全的。可是,针对一个有安全隐患的问题来说,相对安全就是不安全。随着科学技术水平的提升,MD5已经越来越不安全了!

4.MD5如何被破解?


有很多种方法可以破解,不过需要明确一点,这里所谓的破解,并非把摘要还原成原文。为什么呢?因为固定128位的摘要是有穷的,而原文数量是无穷的,每一个摘要都可以由若干个原文通过Hash得到。

对于MD5的破解,实际上都属于【碰撞】3。比如原文A通过MD5可以生成摘要M,我们并不需要把X还原成A,只需要找到原文B,生成同样的摘要M即可。

设MD5的哈希函数是H(X),那么:
H(A) = M
H(B) = M
任意一个B即为破解结果。
B有可能等于A,也可能不等于A。
用一个形象的说法,A和B的MD5结果“殊途同归”。


MD5碰撞通常用于登陆密码的破解。应用系统的数据库中存储的用户密码通常都是原密码的MD5哈希值,每当用户登录时,验签过程如下:

如果我们得到了用户ABC的密码哈希值E10ADC3949BA59ABBE56E057F20F883E,并不需要还原出原密码123456,只需要“碰撞”出另一个原文654321(只是举例)即可。

假设654321的密码哈希值也是E10ADC3949BA59ABBE56E057F20F883E,登录时,完全可以使用654321作为登陆密码,欺骗过应用系统的验签。

2011年,IETF发布了RFC6151——MD5消息摘要和HMAC-MD5算法的最新安全考虑,其中引用了一些最近针对MD5哈希值的攻击。它提到了一个在标准笔记本上一分钟或更短的时间内产生哈希碰撞的攻击,以及另一个在2.6千兆赫的奔腾4系统上仅用10秒就能产生碰撞的攻击。因此,IETF建议,新的协议设计根本不应该使用MD5,最近针对该算法的研究抨击到:在需要抗碰撞的应用中取消MD5的使用,如数字签名。

5.怎么防止MD5被破解?


看完第3点你就知道了,MD5不够安全,但是如果你对它一往情深,只想用MD5的话,不妨可以试下以下做法:

  • 多重加密

所谓的多重加密,顾名思义,就是把你要加密的原文加密成MD5密文,然后再一次将MD5密文加密成MD5密文,多试几次,一般3次以后,在线破解网站就匹配不上了,但是,匹配不上就不代表足够安全喔,只是不容易被轻易破解(因为第二次要破解的原文是一个32位的数字字母的结合,以此类推),增加破解的时间成本而已!

  • 加盐加密

比如Java中的Md5Crypt.apr1Crypt("要加密的密文","自定义盐值"),可以多重使用,自定掂量!

  • 使用复杂密码(包含数字英文小数点等)

经过反复测试,使用复杂的密码也能降低被破解的风险,这也是现在很多软件系统都强制用户的密码不能低于16位数,且应包含数字英文小数点等的原因。

  • 不要在网站中显示密码列,哪怕是加密后回显的,也不可取!

这一点很多初级开发者很容易犯错,在页面数据表格中绑定密码列给用户看,可能只是单纯的展示数据,却忽视了密码这一点容易被攻破的风险。比如下面这种情况,直接在表单回显密码,虽然是不可编辑和加密的状态,但是同样可以进行破解,这点你随便找个有经验的前端开发者应该都会。

6.MD5 的替代品

MD5的一个主要问题是,当信息哈希代码无意中被重复时,它有可能造成信息碰撞。MD5的哈希代码串也被限制在128位。这使得它们比后来的其他哈希码算法更容易被破解。

MD5 的替代哈希代码包括以下内容:

  • 安全哈希算法1(SHA-1)

SHA-1由美国政府在20世纪90年代开发,SHA-1在设计消息加密算法时使用了类似MD5的技术。但与MD5的128位哈希值长度相比,SHA-1产生了更安全的160位值。尽管如此,SHA-1也有一些弱点,也没有被证明是加密的最终算法方法。安全问题开始出现,促使微软等公司停止在其软件中对SHA-1的支持。

  • SHA-2哈希代码系列

SHA-2哈希码是由美国国家安全局在2001年创建的。它们代表了与SHA-1的重大区别,因为SHA-2的消息加密算法更长,更难破解。SHA-2系列算法提供的哈希值长度为224、256、384和512比特。它们以其消息摘要长度的名称而闻名–例如,SHA-224和SHA-256。

  • 循环冗余检查(CRC)码

CRC码经常被建议作为MD5的可能替代品,因为MD5和CRC都执行散列功能,并且都提供校验和。但两者的相似性到此为止。一个32位的CRC代码用于检测数据传输过程中的错误,因此可以识别损坏或丢失的数据。同时,MD5是一种安全的散列算法和加密散列函数,可以检测一些数据损坏,但主要用于正在传输的数据的安全加密和数字证书的验证。

7.MD5 撞库


从技术的角度来说,MD5真的很安全,因为MD5本身是不可逆的,因此没法解密,除了撞库这样的一个方式。在大数据时代,随意生成几个经常使用的密码的MD5密文,然后在百度上搜索md5解密网站,然后把密文复制粘贴进去,随意一个md5解密可能都可以解密出来。

关于撞库,可能很多人都有所了解了吧,这里简单说以下它的原理:通过建立大型数据库,将常用的各种句子密码等加密成为密文,并存储在数据库中;然后拿着密文到数据库网站查询,就有可能查到密码,这是有解密成功的概率,不一定每种密文都能查询到密码。

随着各种加密原文的收集,在庞大的数据中积累了越来越多的大量句子,MD5似乎已不再安全,就像一个post请求,只是你认为他不是明文,他只是阻隔了一部分什么都不知道的人群。但是对于黑客来说,(就算是刚入门的黑客)来说,只要抓住你的请求,数据大概率就会暴露。

日常网站开发,注册用户的密码通常是要求加密的,不然如果数据被窃取,那么用户的密码丢失就会对用户、公司造成可怕的影响。

MD5是经常使用的加密方式,它能够将任意长度的输入串通过计算获得固定长度的输出,而且在明文相同的状况下,才能得到相同的密文,这个算法是不可逆的,即使获得了加密之后的密文,也不可能经过解密算法反算出明文。

举个例子:用户经常使用的密码password,生成的MD5密文就是:5f4dcc3b5aa765d61d8327deb882cf99这是不会变的。这就造成可以使用撞库解密的风险,网上在线md5解密的网站很多,如:https://md5.cn/。

这样子使用有风险,那么就需要使用盐值加密,加入一个随机盐,再次去在线md5解密网站尝试解密,结果失败了。只要随机盐不泄露,那么被解密的风险就降低了。

MD5加密没有这么安全,那么是不是说MD5就没有什么用处了呢?话不是这样说的,对于文件来说碰撞可能容易,但是对于限定长度的密码或者密文来说,MD5作为高性能高安全的数据签名算法来说,仍然很实用。

密码是 password