密码啊密码!
(前面不想看的可以跳到最后,直接看密码设置方法)
信息时代,安全二字出镜率极其地高。各种安全事件层出不穷,一出都是大事。
这方面头绪太多,以我粗浅的认识捋一捋。别的放到后面简单说,先探讨一下一个噩梦般的存在:密码!
一、密码是怎么被保存的
1、明文保存
你输入了两次密码“12345”,注册了一个帐号。好了,现在服务器上存有你的密码了,12345。
真的吗?
真的……很多无良网站,就是这么干的,这就是密码的第一种保存方式:明文。
明文保存密码,如果在互联网刚刚开荒的年代还情有可原。今天的网站如果还这么干,只能说是居心不良了。
怎么判断:你点“忘记密码”,他给你发一封邮件,里面就是你的密码。
2、哈希保存
不是嘻哈,是哈希。
哈希什么意思,英文Hash,中文翻译叫“摘要算法”、“散列算法”。看了这个翻译,怎么样,是不是更懵了。
其实哈希就好比打马赛克。
给定算法,给定原文,生成一个哈希值。为什么叫摘要呢?如果算法是128位的,那么就算你原文长达100个英文字符,出来的也就是16个英文字符。
你看着似乎是乱码,实际……也是乱码,从哈希值里你看不出任何的原文信息。它不是压缩算法,所以你可以从原文算出密文,但不能从密文还原原文。
曾经你以为有一种技术可以“反马赛克”,但其实没有。
早先互联网洪荒时代大家都用MD5算法算哈希,后来发现MD5很容易找到“collision”,也就是说,比较容易找到两个原文,生成的MD5值一模一样。有个中国女人叫王小云的,还找出了一种算法,能在极短的时间内找出collision,这就尴尬了。于是有职业道德的网站开始用一些新的哈希算法: SHA、MD5+salt等等,前者是一类较新的、尚未能快速找到collision的算法,后者则是给每个用户一个随机生成,但固定不变的字符串,称为“salt”,用原始密码,加上这个salt,合起来再生成MD5,这就保证即使两个用户使用了一样的密码,记录的MD5也完全不同。
与马赛克不同的是,原文信息改动一点点,出来的哈希值天差地别。
比如,用.net标准的MD5算法计算“12345”,结果是:
827ccb0eea8a706c4c34a16891f84e7b
计算“12346”,结果是:
a3590023df66ac92ae35e3316026d17d
完全不一样了吧,这也是salt的意义。但是,salt在服务器端生成,你无法确定这个网站够不够勤快,有没有加上salt。
3、高级保存
之所以说高级,是因为一般不会给你用。比如之前帖子里介绍过的公钥加密算法:RSA、DSA,还有AES等等。
不详细讲了,因为我也不太懂。
4、硬件加密
比如招行专业版,登录也得用USBKey。原理是什么呢?
我还是不懂,请自行搜索。
二、密码是怎么丢的?
这事说来话长啊。
既然上面第3种、第4种密码保存方式我不懂,那么就说说明文和哈希保存的密码一般是怎么给盗的。
1、暴力破解
啥意思呢,就是穷举,对明文和哈希都有用。6位数字就从000000试到999999。当然加上字母吧,这个组合就巨多无比了。当年电脑慢,暴力破解很耗时间。可是黑客多聪明呢?搞了个字典破解。
原理很简单:人太懒。懒了就不愿意记太复杂的密码,123456多好记?还有callmehandsome,这些都是基于常用的数字组合和英文单词。用这种方式,再加上电脑速度突飞猛进,暴力破解就快了很多。
可是我们的程序员们多聪明呢,发明了一个神器:输入错误n次锁定。
但是这个对记性不是很好的用户来说,毕竟不方便。
程序员又发明一个神器:验证码。
很简单:每次验证码都是随机的,你怎么暴力破?不可能嘛。这招就是防电脑的。
当然后来又出现了可以分析验证码的破解方法,于是验证码就越来越难看明白了啊。
2、碰撞
碰撞是专门针对哈希码的。啥意思呢?就是说黑客们找到了一些算法,可以快速找到一个可能和原始密码完全不同的字符串,但是算出来的哈希值和原始密码算出来是一样的。
MD5就是因为比较容易碰撞,逐渐被人抛弃了。当然MD5+salt之类正在给它续命,实际上现在用得也蛮普遍。
3、木马
比如键盘记录器木马,把你按的键记录下来,密码不也记录了吗?还有的从发送的数据里抓取密码。然后发送到某个邮箱里去。
当然,上面三种都是正经黑客干的事。实际上来说现在黑客们干的可比这low多了。像下面这些:
4、拖库
顾名思义,把人数据库给拖下来了。当然有时候是网站管理员自己干的。
5、撞库
好比你从A站拖了个库,是明文密码的,然后你到B站去,用那些明文的用户名和密码来登录,10个里面有5个能登录,这就是撞库了:从一个站破解出的密码,去用到其它网站。
6、社工库
这个名字有点难以捉摸,其实就是用户名-密码,或者哈希值-密码原文的比对库。黑客们把已经破解的这些数据做成数据库,分享出来,就是社工库。这样,如果你在一个地方被盗了密码,所有会用社工库的人就都知道了……哪怕只是知道Hash值,在一些社工库也能比对出密码来。
7、买卖
这个不用解释了。
8、其它
比方说网络数据抓包啊之类的,这些是针对小范围或者特定人的攻击破解。
三、怎么设置密码最安全呢?
从以上破解方法你应该知道,根本没有绝对的安全。我们只能尽可能地防。
所有的网站都试图告诉你:要用尽可能长、要同时有大小写字母、数字甚至符号混起来用,这样的密码,强!
然而这个指引,只是在增加暴力破解所需要的时间罢了。不要说有了验证码技术以后暴力破解已然很难,就算能,也没有黑客愿意花时间做这个事。
针对以上各种破解,好的密码设置,应该做到:
1、比对不了任何字典
这样就不容易被暴力破
2、每个网站记录的哈希值都不同
这样就避免了撞库,社工库的危害也小了些。
3、和别人的不一样
同上。
因此我总结的设置密码(安全)三条原则:
1、不要用现成的单词
2、不同的网站用不同的密码
3、不能过分难记
具体来说,提供一种方法供大家参考:
第一步:把你的网站分成4大级别
S1级:跟钱有关系(支付宝、网银,切记一定要有一个使用S1级密码的邮箱,用来绑定这些帐户)
S2级:跟个人隐私有关系(QQ、微信等各种IM、SNS、重要的Email等)
S3级:频繁使用,帐号丢了很心疼的(smzdm啊,论坛啥的)
S4级:无所谓的网站(有时候为了看一个帖子,但是隐藏了,你必须注册了才能看的那种)
第二步:选两个单词和一个数字串
比如spring brother,你的生日19810908。
数字缩一下:918
从里面选几个字母,比如:
spribrt
数字加进去:
(密干)sp91rib8rt
大小写:
(密干2)sP91rib8Rt
好了,其实这个原密B已经很像乱码是不是?还不够
我们在里面空两个位置出来,比如:
(原密A)sp91ri_b8rt_
(原密B)sP91ri_b8Rt_
第三步:分级设置密码和安全工具
S1级
这种的用密码还嫌不够,如果有USBKey,就买一只。钱不多,安全性提升不少。然后咱还得有个密码,就用原密B,然后在两个空位里填上这个网站的关键字母,比如淘宝,密码就设成这样:
sP91ritb8Rtb
S2级
按S1的密码方式设置为好。
S3级
同S2,只是用原密A而不是原密B,因为这样比较容易输入。
S4级
建议用小号用户名,密码随便啦。
当然了,现在这个时代,密码仅仅是安全上的一个小部分。千万不要以为有了好密码就万事大吉。漏洞无处不在,各位还是小心再小心。