什么是md5?
md5是一种不可逆的散列算法
- 不可逆:从明文可以得到密文,但是从密文不可以得到明文。
- 散列:通过一种函数得到一个映射值,有可能是重复的!但重复的概率比较低,例如设置字符+大小写字母+数字的密码,能通过散列得到相同密文的概率就非常非常低了。
应用场景
-
密码存储:
处于安全考虑,原生密码不能直接储存到数据库中,如果数据泄露会导致许多问题,因此,会将密码经过md5加密后储存至数据库,这个大家肯定都知道。 -
一致性校验:
这个是我在做支付签名时候发现的一种用法,以前没有使用过。客户端调用第三方支付时,需要是用http(s)传输请求,一旦请求被拦截,被修改,例如支付1000元,被拦截成1元,支付成功后,第三方返回支付成功的结果,会造成严重损失。于是人们使用一段密文,将请求参数加工为一个字符串:例如“amount=50&payMethod=native&id=012345”,然后将这个字符串进行加密,请求时一同发送。收到请求后和明文参数做一次一致性的校验,校验参数的一致性。
当然,真正的涉及到支付的加密手段会更加复杂,例如证书等,使用这个例子只是说明md5可以作为一种校验密码一致性的一种手段。
如何提高安全性
-
加盐
盐值就是一段无意义的随机字符串,可以是一段uuid,也可以是一段随机数字。加盐可以避免黑客使用一些对照表破解简单的密码(比如123456,password这些常用密码,使用频率很高,可以从对照表中查询到)。 -
多次加密
将加密过md5密码再加密,循环几次,这样形成的密文也无法通过对照表来找到。