想不到一句“MD5加密”,竟然惨遭大量程序员的嘲笑!很多人给我普及MD5相关的知识,甚至有恶语相向的,我感觉整个人都不好了,所以,针对“MD5加密”这件事情,我们再讨论讨论,另外,还有几个针对MD5大家讨论得比较热闹的问题,看看我是怎么理解的。

文章开始之前,看看网友们是怎么说的吧!如果内心不够强大,还真受不了!

“MD5加密”只是通俗叫法

首先,为什么我会说“MD5加密”,我当然知道MD5是哈希(HASH)算法,MD5本身并不是用来做加密运算的,而是用来创建数据快照或签名的,当然,您可以说它有任何作用,毕竟,代码是死的,人是活的,我们不可能被一个代码算法的定义憋死。

“MD5加密”只是一种通俗的叫法,当然叫法有很多,比如说“MD5哈希”、“MD5混淆”、“MD5签名”等等,“DM5加密”只是我喜欢叫的一种方式,但这么叫的不止我一个人,并不是因为我认为MD5是加密算法,而是当沟通变多了,”MD5加密”是更加通俗易懂的叫法而已,至少在我过去的工作经历中,“MD5加密”、“MD5验签”是最常用的两种叫法,其他叫法会存在沟通困难的情况!

很多人盯着我说“MD5加密”这个叫法很Low,因为MD5压根就不是用来加密的,能加密就说明能解密,还举了各种例子,比如说一个几十G的视频,在MD5加密后(请容许我这么叫),只留下了16位或者32位的HASH值,这种情况压根无法逆向解密

这种说法我也认可,但我认为太强迫症了!

前面说了,“MD5加密”只是一种叫法罢了,程序员互相之间沟通没有问题就行,如果在日常工作中,程序员互相沟通,当您说到“MD5加密”,别的程序员说:“MD5不是加密,是签名、是HASH!”,类似的沟通如果是这样,您猜结果是咋样的吧!

看互联网三巨头的代码

很多人认为我说“MD5加密”比较Low,但如果您看过一些大公司,甚至是头部公司提供的官方接口SDK源码的注释,您就知道,那些大公司的程序员也是这么叫的!

下图中举了三个例子!

京东官方SDK局部代码

淘宝官方SDK局部代码

拼多多API局部文档

至少人家互联网大厂没觉得称呼“MD5加密”比较Low,我又算啥!

这里我觉得我讲明白了,一些号称专家的,就不需要给我普及相关知识了!

MD5用作密码HASH不安全?

还有一个大家比较关心的话题,那就是MD5到底是用来干嘛的!有些人说用来验签,有些人说是用来做索引。

每个公司的使用场景都不一样,其中,讨论最多的就是MD5到底能不能用来给密码加密。

没办法,您不得不承认,还有大量的公司拿MD5存储密码的HASH值!所以,此时说MD5是用来加密的,好像也说得通!

您如果说:“叫加密就是为了能解密,而MD5不能不能逆向解密,所以不能叫解密!”,那我就真拿您没办法了!

至少我过去接触的很多密码加密解决方案用得都是MD5,到现在拿到一些开放平台的SDK中,密码加密还是使用的MD5,只不过会对MD5进行加盐!

做法一般是通过用户ID或者其他一些标识按照指定顺序先转成Base64,然后再进行MD5或者HMAC进行“加密”(注意啦,加引号啦!)。

上图中,基本上都是用的这种方法!

但还是需要解释一下,通过这些方法形成的16位或者32位的byte值并不是我们所认为的“密文”,而是哈希值!

前端传入的数据也会进行相同的处理,然后跟数据库存储的哈希值进行比较,而不是想象中后端会先解密,再比较!

至于大家所说的,MD5可以使用彩虹表等方式暴力破解,其实也很好解决,最常用的方法就是加盐!

但如果直接MD5那就一定不安全吗?那只是数据层面不安全,如果没有加盐,别人拿到了数据库,那么就可以直接对数据库里面的MD5的HASH值进行暴力破解。

这个的确是的,但别人得拿到你的数据库才行,如果单纯从接口层面想要破解,其实应对方案还是挺多的!

比如说大家都比较常见的方案就是密码连续输入错误3次就锁定登录,异地登录需要短信验证等等,都可以避免使用MD5对密码进行暴力破解。

因为MD5的暴力破解原理很简单,其实就是碰,只要密码不是那种“123456”这种简单的形式,以上两种限制已经足够能够应对MD5的暴力破解了!

有人会说:“万一别人一次成功呢?”

呃...,的确有这种可能吧!那可以要求用户密码不能过于简单这个方式解决!

结语

说到这里,我觉得我已经说得很清楚了,如果您还执意说:“我需要纠正你,MD5不是加密算法!”,那我只能求放过了!

最后,借用一个网友提问我的问题,这位网友是这么说的:“如果MD5被用作密码加密,且这种加密是不可逆的,那么你怎么解释有些网站在修改密码时,输入密码时会提示‘新密码和旧密码相似度太高!’”。

我的想法是,在用户注册账号密码时,密码先会被整体HASH,然后,再将密码按照指定规则进行拆分,拆分的部分再进行HASH,然后将拆分出来的HASH值再单独存储,在修改时,再按照拆分规则对新密码的拆分HASH跟旧密码的拆分HASH进行比对,设置一个相似比例,超过相似比例再报相似度太高的提醒就可以了。

不知道,您认为这种解决办法可行吗?或者您认为还有什么解决方案呢?