可以说我接触的第一个密码算法就是MD5了,对其也有一些自己的理解,一些发现。
一、理论MD5碰撞
我们一般看到的MD5值都是16位或者32位的,不管怎么说,MD5值所能表示的数值是有限的。
那么,当字符的长度不断增长,MD5值就可能出现重复
MD5(str1)= MD5(str2)
二、字符加长应对MD5破解
可能很多人都知道,MD5是单向哈希函数,但它也是一一对应的。
所以现在有很多站点都提供了大字典,对MD5进行反向查询。
作为一个web开发者,他的用户也许喜欢123、123456、88888888之类的密码,也就是我们说的弱密码(专业点叫弱口令)。
如果你的设置中不允许他们使用这类密码,他们就会表示很反感,表示密码难记。
那么,我们就可以考虑使用字符串加长来应对用户的需求,同时对抗入侵者的破解。
用户注册账号时:密码 123456 -> blog.csdn.net123456 -> md5 (blog.csdn.net123456) -> AD0C137D4F131FC25EB5ECDF8B068E18 ->存储进数据库
用户登录: 用户输入密码123456 -> 脚本语言加入字符串 blog.csdn.net -> 变成 blog.csdn.net123456 -> md5 运算并与数据库中的值进行比对。
这样来说:黑客如果拿下了数据库,对数据库中的字符进行crack 的时候,得到的是blog.csdn.net123456 这个值,而不是用户登录的值。
对暴力破解MD5有一定的意义。
小结:使用MD5越来越不安全了,密码长度的增长加重了人们的负担。
三、MD5值截取
这个是前段时间进行sql injection 的时候发现的,做法很简单。
一般的MD5是16位或者32位。
那么,我们字符MD5结果的32位进行截取,比如
MD5(admin)= 21232f297a57a5a743894a0e4a801fc3
16位:7a57a5a743894a0e
那么,我们为什么要按照16位的规则来截取呢,我从第一位开始截取,截取16个字符不行么?
进一步:我为什么一定要截取16位呢,我截取12位不行么?实在不行,我从第三位开始,截取20位总行了吧。
四、MD5 二次加密
这个就不用多说了吧,注册进行存储的时候进行两次MD5运算。
同样,验证的时候也进行MD5两次运算。
总结:关注信息安全,关注网络生活,希望大家开开心心过好每一天,别被这些破事搞坏心情。