关于拖库跟撞库的思考与对策
拖库是指黑客盗取了网站的数据库。撞库是指黑客用拖库获得的用户名和密码在其它网站批量尝试登陆,进而盗取更有价值的东西。由于一些用户在多个网站用相同的用户名和密码,所以撞库是有一定成功率的。现在稍微有点责任感的网站都不会将密码明文保存在数据库中,起码会做一次MD5。要想撞库,必须得知道密码的明文,也就是用户真正输入的密码。我们知道MD5算法是不可逆的,黑客是怎么弄到密码明文的呢?最常用的办法就是MD5字典。
MD5字典是什么?
其实就是提前将一些比较简单的密码(比如10位以内的纯数字)做MD5运算,将结果保存下来,破译密码的时候直接查就行了。比如字符串“123”的MD5值是“202cb962ac59075b964b07152d234b70”,黑客在拖来的数据库中看到某位用户的密码是“202cb962ac59075b964b07152d234b70”,通过字典一查就知道密码明文是“123”了。当然黑客用字典破译密码不会人工一个一个的查,而是用程序批量查询的。
所有密码都能用MD5字典破译吗?
理论上可以,但实际上只能破解比较简单的密码。下面我们看看不同复杂度密码对应的MD5字典有多大。
1.10位以内纯数字
共10^1+10^2+10^3+10^4+10^5+10^6+10^7+10^8+10^9+10^10=10(1-10^10)/(1-10)=11,111,111,110条≈110亿条
保存每条记录至少需要42字节(密码10字节+MD5值32字节),则存储该MD5字典至少需要约467GB空间。
2.10位以内的数字+小写字母
共36(1-36^10)/(1-36)=3,760,620,109,779,060条≈3760万亿条
保存每条记录至少需要42字节(密码10字节+MD5值32字节),则存储该MD5字典至少需要约157946TB空间。
通过以上两个例子可以看到,如果用户的密码是10位以上的数字和字母组合,通过MD5字典破解的概率几乎为零。但并不是所有用户的密码都足够强,黑客拖库后,使用弱密码的账户很容易就被查到明文了。对于使用弱密码的账户,被拖库的网站就无能为力了吗?不是的。办法也很简单,只要在MD5的时候加一个稍微复杂点的盐(比如GUID/UUID),就能极大的提高用户密码的安全性。
加盐后的明文=明文+盐;
密文=MD5(加盐后的明文);
以GUID/UUID作为盐为例,哪怕明文再简单,加一个32位的盐,加盐后的明文也在32位以上了,通过MD5字典来破解是不现实的。
如果所有网站都没有加盐,黑客只需建一套MD5字典,所有网站都能通用。如果所有的网站都加了盐,退一万步讲,哪怕盐也被黑客盗了,也不能用通用的MD5字典,得为每一个拖库的网站建一个字典。这样成本会高很多,如果动力不够,黑客就放弃了。
防止拖库和撞库的对策有很多,我这里只是分析了其中的一点,并提出了相应的对策。办法很简单,相信很多网站也加了盐,或做了更复杂的操作,但没有加盐的网站也很多,要不然就不会经常发生撞库的事了。
尽全力保护用户的信息安全是每个网站应尽的义务,这样才对得起用户对你的信任。一个小小的改变可以让用户的密码更加安全,希望能引起所有网站的重视。
- 10楼牛腩
- 数据库中密码字段全都只以MD5的形式保存的路过。。。,加盐的话那不是盐也要存在数据库中?
- 9楼RIBBIT.NET
- s=quot;123quot;;,,function md5e(s){,i=0,m=s;,while(ilt;=10){,m=md5(m);,i++;
- 8楼三劫散仙
- 安全是提高了,但也变得复杂了, MD5(用户密码+UUID),虽然能极大增强安全系数,但是,你也要把这个UUID存储下来,否则用户登录的时候,会登录密码失败?
- 7楼xuanbg
- 盐肯定不能存数据库,存了就没用了。一般写代码里面,因为这个不能更换,更换了自己也不认更换前的密码了。问题是拖代码比拖库更简单啊,把代码拖走反编译一下就知道盐是什么了,加了还是白加。。。然并卵
- 6楼Do you know, jack?
- 每个用户一个盐值,想破解基本不可能了
- 5楼ChenXif
- 盐是怎么加的?不懂额
- 4楼杨彬Alen
- 通俗易懂!赞
- 3楼BIT祝威
- 通俗易懂!赞
- 2楼杨彬Alen
- 盐只是一个公用的一个随机码。不需要每个人分配一个,更不需要放到数据库中,加密解密的时候在密码上加上这个随机码就行了,比如密码是123,加上盐后是123aaa,不知道理解的对不对?
- 1楼lngg057
- ke@三劫散仙,引用安全是提高了,但也变得复杂了, MD5(用户密码+UUID),虽然能极大增强安全系数,但是,你也要把这个UUID存储下来,否则用户登录的时候,会登录密码失败?,肯定啊,不存储的话,到时候登陆你怎么校验正误呢?这个相当于系统单独给每个用户附带了一个随机密码,增加破解难度,这样想使用通用库破解难度也会大很多