加密算法先锋 — MD5算法

1,041 阅读5分钟

前言

在开发过程中,避免不了要涉及到数据加密,比如用户账号密码的加密,用户敏感数据的加密,涉及到的加密算法种类繁多,能够清楚了解其中主流的加密算法和用途,就已经足够了。主要的数据加密算法主要有:md5、sha、aes、des、rsa、base64等等。今天先来看看我们的老熟人:md5算法

一、MD5算法

MD5算法是哈希算法的一种,MD5算法全称叫 Message Digest Algorithm 5(信息摘要算法5),是数字摘要算法的一种实现,摘要长度为128位。MD5 的核心是通过算法把任意长度的原始数据映射成128 bit 的数据。MD5由美国密码学家罗纳德·李维斯特设计,于1992年公开,用以取代MD4算法。

二、MD5 到底算不算加密算法?

由于它哈希算法的典型特征,注定了他无法从密文准确还原出明文,因此MD5算法不能算真正意义上的加密算法,但几乎在任何一个系统中,都少不了他的身影。很多地方也笼统地叫它是加密算法。由于其具备了足够的复杂性和不可逆性,因此主要用于确保信息传输完整性和一致性。他还有早期的“不太争气”的几代MD2、MD3、MD4(早期的几代就是由于复杂度不够被破解了)。

三、MD5的特征

1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。

2、容易计算:从原数据计算出MD5值很容易。

3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

四、MD5的安全性

最常见的,很多系统中的用户密码都采用了MD5加密算法进行加密。但是树大必然招风,就像windows系统应用广泛了,安全性就收到了挑战,MD5也不例外。度娘一下就会发现,有诸多网站提供MD5破解,有的甚至需要收费提供破解服务。不过不用担心,目前能破解MD5并还原出原始数据的成功率很低(当然像123456这种弱智的原文,就不要提了)。

【4.1】MD5算法的主要破解思路

其实核心只有一个,那就是暴力碰撞(其他还有两种:字典法、彩虹表法都是暴力碰撞法的改良,原理一样),说白了就是用已知的字符进行各种变态组合,生成众多的密文与原文的对应库,然后反向根据密文,找到对应的明文。

比如,你的明文数据是 abcd1234,加密出来的密文是e19d5cd5af0378da05f63f891c7467af,那么不安好心的人就拿着你的密文e19d5cd5af0378da05f63f891c7467af 去网上提供这种密文破解工具库或者服务那里,查询这个密文有没有对应明文,如果有,就代表破解成功了,然后他就拿这个“破解”得到的明文去登录你的账号,结果可想而知。成功进入了你的领地

但这也有漏网之鱼,因为即使破解出来的结果不是上面说到的abcd1234而是xxxxx,也有可能用xxxx成功登录系统。因为MD5虽然不可逆,但不是唯一性。 这里所谓的破解,并非把摘要还原成原文。为什么呢?因为固定128位的摘要(也就是加密后的密文)是有穷的,而原文数量是无穷的,就是不同的原文可能加密后得到相同的密文。那么拿密文猜测原文就会得到多个结果,单纯比较密文,就会被认为是一致的。而反过来,也是同理。拿到不一定对的还原出来的明文去做其他操作,也不一定能成功。

【4.2】MD5加密算法之所以破解成功的概率很低,主要由于以下几点:

1、依赖暴力碰撞的破解思路,意味着需要尽可能多的组合所有字符,形成海量的配对库,用于通过密文反向查询明文,但字符种类千千万万,所有都进行组合,可能性都超过地球的细胞总数了,估计现在所有硬盘加在一起的空间都存不下,成本之高,可想而知。

2、目前能破解的都属于已经被组合猜测过的,一般也都是长度较短的或者比较有规律的组合。只要长度越长越没有规律,不同类型字符组合越多,破解概率越低,几乎不会成功。

3、就算密文对了,原始明文也不一定对,当然这是最后一道防线,听天由命了。另外,MD5的用途,目前主流的无非两种,一种是用于类似用户密码等不需要还原的敏感数据的加密,一种是用于确保信息传输完整性和一致性。其实,第二种用途才是他诞生的初衷。

五、在Vue中引入MD5

【5.1】npm安装

npm install --save js-md5

【5.2】使用

1)方法一

    // 在需要使用的项目文件中引入:
    import md5 from 'js-md5';

    // 使用:
    md5('admin') // bca6cdedf5e5b1b02f718438ac61ca12

2)方法二

    // 在main.js文件中将md5转换成vue原型:
    import md5 from 'js-md5';
    Vue.prototype.$md5 = md5;

    // 在需要用到的文件中使用:
    this.$md5('admin') // bca6cdedf5e5b1b02f718438ac61ca12