星期一, 十二月 26, 2011

密码安全简单原则

  • 不使用短密码,密码长度尽量大于10个字符
  • 不使用简单密码,尽量使用由大小写字母、数字和符号构成的密码
  • 不使用英文单词或者汉语拼音做为密码
  • 不使用与自己和家人相关的信息如用户名、生日、地址、证件号码等构建密码
  • 不使用简单规则构建密码,不使用简单字母顺序或者键盘顺序构建密码
  • 不要在所有的网站使用相同的密码和用户名
  • 不要在网络上或者自己的电脑上存放重要的密码
  • 网站管理者存放用户密码不要使用名文,加密的密码要给每个用户使用不同的密钥
具体分析请见上篇博文

怎样构建安全的密码,如何安全地存储及使用密码

最近国内很多大网站数据被爆,引发了网络安全的地震。这个事情说明了一方面某些网站不重视网络安全或者安全观念不强;另一方面从爆出的密码本身看出大部分用户使用简单密码或者看起来复杂实际却很容易被破解的密码,说明我们平时自己网络安全意识也不够强。所以这里希望介绍一下怎么构建安全的密码防止暴力破解,网站怎么存储密码才是安全的,即使在数据库被盗的情况下也能一定程序上防止用户密码全部快速沦陷,然后就是在网站安全措施不到位的时候,做为用户的我们怎么使用密码,才能防止一个密码丢失整体网络安全受到威胁。本人水平有限,班门弄斧,不足之处还请指教。

首先是安全的密码,密码本身安全就是说密码不容易被人猜到,而且当黑客得到你加密的密码和加密算法后使用暴力枚举的方式很难找到你的真正密码。很容易想到,其实最安全的密码就是足够长的由所有可以做为密码的字符随机构成的密码,长度应该尽量超过10位字符,应该同时包含大小写字符、数字及特殊符号,比如这个16位的密码ZAzg_E;9T0b3c.o5就是相对比较好的密码。但是一般来说,为了便于记忆我们使用对自己有意义的字母和数字构建长度足够的密码也是可以的,比如删除前面密码中的特殊字符后ZAzg_E9T0b3co5这个14个字符的密码也是相对安全的。

为什么我的密码不安全?从最近泄漏出来的数据库来看,不说明文,加密的密码很多是直接把用户密码取MD5值存放。在这个背景下来看:
短密码:现在的电脑的处理能力(数据计算)非常高,一台普通的家用电脑计算所有7位字符的排列的散列的时间不超过一天,计算8位字符排列的时间不会超过1个月,每增加一位字符所需的时间大概增加30倍,所以很容易看出来,当你使用10位安全的密码(完全随机)的时候,在知道你密码的散列值的时候(抛开MD5本身漏洞不考虑),用普通电脑暴力破解你的密码已经不太现实了(40年)。
不太随机的密码:有人说我的密码是字符加数字的组合,而且长度超过10位,但是还是很快被人破解了。这就有可能是你使用某种不安全的规创建的密码,1.密码中的字符或者数字跟你用户名中的一致;2.密码中的字符或者数字跟你生日、地址、电子邮件或者任何其它可能跟密码存放到同一数据库中的信息一致;3.使用了英文单词做为你的密码;4.密码使用简单规则,比如a1b2c3d4e5(简单顺序)、1q2w3e4r5t(键盘顺序)、ilovexxx123(单词)、someenglishword123等。试想,存放在数据库中的个人信息是有限的,密码取自这里面的字符,必然大大降低破解者的计算难度,如果你的用户名是billgates,你用了bill123gates456,好了,暴力破解从你的用户名开始,在不同的位置加字母,相当于破解了一个六位的纯数字的密码。取自其他个人信息以及简单规则密码道理相同,都是降低了破解者的计算复杂度。

其次就是做为网站来说,怎样安全的存放密码,即使数据库被盗,破解者也不会在短时间内拿到所有用户的密码。看到这次泄漏出来的数据库中有些密码是MD5加密存放的,说明网站有一定的安全意识,但这是不行的。密码存放不能只由单一的密码进行加密,即使使用了不可逆的MD5算法,username:md5(password)这样的存放方式也是不安全的,密码存放应该在算法中为每位用户使用单独的密钥,防止批量暴力破解。比如:username:salt:md5(password+salt),用这样的方式存放。重要的是:要用被证明安全的算法加密用户密码,不要试图设计一个加密算法,期望永远不被别人知道来保证密码安全,简单的说,数据库都被盗了,还有什么加密的代码是安全的呢?即使是二进制文件,也可能反汇编看到算法。这时如果被人发现算法有漏洞怎么办。

Linux用户可能都看到过系统密码存放,abc:password:salt。那个password是md5加密的,但是salt是做什么用的?为什么有这么一个字段呢?先看看为什么只存放MD5不安全,假如我们有两个用户alice、bob,他们的密码都是mypassword,这样用user:pass的方式存放,密码文件如下:
alice:34819d7beeabb9260a5c854bc85b3e44
bob:34819d7beeabb9260a5c854bc85b3e44
看到问题了吧,假如alice的密码被破解,bob的密码也就丢失了。据某网站分析,泄漏数据中使用随机字符和数字组合长度足够的高强度密码大概只有三十分之一,也就是使用单纯MD5加密的方式存放密码,破解在有限时间内的单次遍历计算中就能破解96%的用户的密码!
再回来看看linux存放密码的方式,使用salt字段,alice为123,bob为456,密码文件如下:
alice:9c87baa223f464954940f859bcf2e233:123
bob:4ae95041d151e8997a3dde671bf8ae59:456
可以看到生成的加密的密码已经不一样了,这样不能再同时解得两个密码了。破解者在计算的时候需要计算的是md5(pass+salt),由于salt不同,有多少个用户,就得进行多少次遍历计算。虽然不能防止目的为单个用户的攻击,也不能增加破解计算单个用户密码的复杂度,至少我们能大大延长破解所有用户密码所需要的时间。

最后说说做为用户的我们怎么安全的使用密码。从这次泄漏事件看出,网络安全问题切实存在。而且大量的明文密码泄漏说明使用单一的安全密码并不能保证我们的网络安全,应该为不同的网站使用不同的密码。如果这太复杂的话我们可以把网站分类,1.Gmail、Hotmail这类邮件经常做为我们注册其它网站和接收重置密码邮件用,要单独使用密码;2.网上银行、购物网站等与现金安全相关的要使用单独的密码;3.普通小网站的密码要和QQ、新浪、网易等大网站使用不同的密码。Last But Not Least,不要将密码存在网上,也不要存放到电脑上,如果要存放在本子上,确保本子不被其他人看到。这次事件给大家的教训就是:不要相信网上的任何牛人和任何知名网站。更不要相信仅凭我说的这些就能让你更安全。

星期日, 十二月 25, 2011

查询你的信息是否在被黑数据库中

前几天CSDN、178、7k7k、多玩、嘟嘟牛、天涯等几个大网站数据库被黑并公开发布,在江湖上传得沸沸扬扬。批评密码名文存放这种低级错误于事无补,就个人来说,最紧要的就是尽快确认自己的信息是否跟随被黑数据库一起泄漏。因为一般人都是一个密码用很多地方,如果泄漏,其他账号的安全也会有很大问题。
http://tt.undo.it/leakdb
这个网页可以查询你的信息是否处于被黑数据库中,提交你注册的任何信息,用户名,email,昵称什么的(当然,提交密码也能查得到,不过为了你的安全,不建议这么做)。如果查到了,它会提示“Bad News”,那你得赶紧改密码了。如果提示“Good News”说明没查到,当然,建议你也经常改改密码,这里没泄漏不代表你的密码绝对安全。网页的查询只有一个字段,所以不必担心是钓鱼网站。