以CSDN密码泄露事件为开头,接连多个知名网站中枪……可以说突然把很多人无意中忽略的密码安全问题狠狠地甩在了面前。这种东西据说在某业界或许已经流传了很久了,不过这次曝光终于是明明白白给大家敲响了警钟。

很久以前我以同样的标题写过一系列文章,但是还没进入到关键部分就因为种种原因停更,数据也没了……总之借此机会再把这些东西拿出来晒晒太阳吧~

首先声明,以下内容,其组织结构和部分实例来自于Mark Burnett和Dave Kleiman所著的《Perfect Passwords: Selection, Protection, Authentication》(中文名《完美口令》,科学出版社),本文只是一个简略的叙述(当然这本书确实为了通俗易懂废话颇多……),以及结合自身经验的总结。本人只是一只小小菜鸟……

本文将分为两个部分,第一部分介绍密码的安全性的评估,第二部分谈一谈密码的安全如何保障。


第一部分 密码的安全性的评估因素

你的密码没有你想象的那么安全,即使不出现CSDN这样的大规模密码原文泄露状况。人类的思维其实是有特定的模式的,尽管你认为你的脑子已经拐了几个弯,但是依然是有迹可循的。

如果让你说一个蔬菜的名字,98%的人会告诉你白菜(对于西方人是胡萝卜)。如果让他们从50-100之间任意挑选一个十位与个位不同的数,很多人会选择68。如果是挑一张扑克牌,方块9、黑桃A、红桃Q、梅花6出现的可能较高一些。

如这次CSDN泄露出来的密码中,111111、123456789、qwerty这样的密码牢牢把持着出现频率的前列。简单的字词、简单的数字单词组合、简单的字符替换/添加、生日/电话,这几类涵盖了大部分密码。毫不夸张的说,如果你坚持使用这些密码,即使这次泄露出来的并不是原文而是MD5散列值,要破解也是分分秒秒的事情。

密码安全围绕这样一个基本的原则:生成一个没有人能在给定时间内猜测(预测)到的密码,并持续定期改变它,使它更加难以预测。因此,一个密码是否安全可以从以下4个方面来看:随机性、多样性、长度、时间。

随机性

随机性由以下三个方面来衡量:均匀分布、不可预测、唯一。首先,随机序列中每个字符的出现概率均等;其次,每个字符与其前的字符没有任何关联;最后,随机产生相同序列的可能性接近于0。

人类的语言不是随机的,所以很明确的一点是,拼音也好单词也好,都有很强的可预测性。(即使没有字典,马尔科夫链也不是闹着玩的。)比如说,英文单词里面,q后面几乎一定是跟着u的……据证明,英语中大约有50%的信息冗余,即省略掉一个句子一半的字母,仍然可以被人们理解。所以一个由单词构成的密码,在信息量上仅相当于长度为其一半的纯随机密码。

同时要指出的是,目前常见的“随机”是不可靠的。让你在键盘上乱敲,“asdf”和“uiop”露脸的机会实际上是很高的(asdfgh是很受欢迎的密码……)。同时计算机所使用的“随机数生成”实际上是伪随机数生成器。它是有算法的,生成的只是看起来随机的数。使用过VB6的同学应该知道,如果程序开始不进行随机初始化的话,每次运行生成的“随机数序列”是完全一样的。真正的随机性来自于一些人类尚无法把握规律的东西,比如——大自然。www.random.org就是使用大气中的电磁噪音来生成随机数的。

当然不真正随机并不就那么不安全。破解密码者无从知道他是不是只猜错了一个字符,所以只要保证较低的可预测性就可以了。

多样性

多样性指字符的多样性。这其实是……非常好理解的,只要你学习过高中数学,就知道阶乘的增长性有多么恐怖,知道相应的排列组合其实是一样甚至更恐怖的……

一个密码中所可能包含的字符集主要包括以下四类:数字、小写字母、大写字母、其他字符。通常出现的概率依次减小……一个良好的口令至少应当结合使用其中的两者。从一些统计规律上看,也有一些小技巧可以遵循:

数字的出现概率是最高最高的,在此基础上1的概率又比其他数字高出一倍。
使用小写字母的占75%以上,全部使用小写字母的占60%以上。
包含大写字母的密码少于3%,而且通常大写字母只出现在第一位或第二位。
其他符号常常只出现在最后一位。
很多密码是允许使用空格的。空格的优点在于你即使写在纸上别人也未必能尝试正确……

长度

密码并不是越长就越安全,而且大部分场合下长度有限制。你使用1填满密码框,对于破解者来说只要在思考“究竟要不要破解”的时候无意识的敲一敲键盘就破解成功了……增加长度带来的破解难度增长是与你字符的多样性有着密切关系的。字符多样性越强,每增加一位长度带来的安全强度收益就越高。

在一些密码长度充裕的场合,你可以比较放心的使用单词,来组合成一些有意义的词组来协助记忆。同时,将密码分割成多个部分,每个部分使用互不关联的记忆因素来构建密码并将之组合,也是有效的兼顾记忆和强度的方法。

时间

密码不可能100%的长久被保护,总有人试图获得你的口令。你不要寄希望于“我是不值一提的小人物”这样的想法。实际上CSDN密码泄露后,尽管有600W用户之多,但是很多中枪者登录CSDN的时候发现自己的密码确确实实真的被修改了。当然,破解或获取一个密码是需要时间的。如果再这个时间之内我就更换掉密码使之失效,就可以有效保障信息的可靠和安全。

在很多机构里,管理员要求用户60天到120天更换一次密码。但是实际上如果使用了较弱的密码,在短短的几个小时之内就就可以被破解。从各种角度来说,我宁愿使用一个比较强的密码,然后几个月才更换一次。所以时效性是一个方面,但是仍然是与其他因素相辅相成的。

同时,不要使用两个口令来回换这样幼稚的手段来建立基于“时效性”的安全……在更换密码的时候,也尽量采用不同的构建策略。


第二部分 基本的密码安全策略

一、密码的构建

这部分内容可能比较杂乱……还是像上次任务管理器一样,写成Tips吧~

1.密码的第一原则其实是能记住,你完全记不住的密码还是老老实实放弃吧。
2.把一个密码分成多个小节来进行构建和记忆,既能保证长度,又能有足够的复杂性和较低的可预测性。
3.构建一个类似于email地址格式的密码其实是一个好主意。
4.你可以通过在现有密码的左右两侧添加<>()-+之类的符号的方式有效增加字符多样性和长度。这叫做“包装”。
5.非要使用单词的时候,你可以使用多个并用符号连接他们。
6.a和@、l(小写L) 和|、S和$、1和!、A和4的互相替换,形近易记。
7.某些词组可以通过调换首字母的方式产生诡异又不影响记忆的新“词”,比如word-press变成pord-wress,某人开发的iPhone一个打地鼠的游戏名字叫做“Bustin Jieber”……
8.如果你懂外语的话,在密码里使用吧!
9.写好的密码敢不敢扔到Google里面搜索一下?有时候你会发现你辛辛苦苦构建出来的密码其实还是很热门的。
10.密码的输入方式其实也是一个考虑的要点。有实验证明通过录下用户输入密码的声音,再对照英文字典之类的工具再进行密码猜解,准确率高达90%以上……那些想在密码里使用空格的更是一下子就会被发现了。

二、密码的管理

首先,不要在所有的地方都使用同样的密码。也许在所有的地方都使用不同的密码是很困难的,那么就在心里为使用密码的地方评一个级,有针对性的选择并构建密码。最起码不要发生丢了一个密码结果所有的东西全丢了的惨剧。

其次,说一下密码的记忆。千万、千万、千万不要把密码写在纸上。很多人甚至有使用便利贴将密码贴在显示器上的习惯……这就是所谓的“非技术性攻击”,从某种程度上说毫无困难可言。最好的方法当然是用脑子记。当然基于第一条,如果密码太多的话其实也是很痛苦的……有一些软件就是专门拿来管理你的密码的,用在哪里、用户名、密码都可以记下来并且统一加密储存。目前比较常用的就是KeePass Password Safe了。本文在首页上使用的缩略图就是KeePass的Logo。

最后,再次强调一下密码的时效性。在《Perfect Passwords》一书中,建议每个人为自己设立一个“Password Day”,在这一天中,放松下来花点时间好好思考自己下一个密码使用什么,然后统一、一次性的对自己的密码进行更换,至少一年一次。当做一个节假日来庆祝其实是一个不错的选择。

最后对这部分内容来个简略的总结,仍然来自《Perfect Passwords》。这篇文章已经涵盖了书中的大部分内容,并且对一些主要适用于海外的策略进行了删减。但是此书通俗易懂,对于没有基础的普通人群来说也是极佳的教程。好吧……确实废话多了点……

强密码的三个准则:

复杂性准则:复杂性使得密码的强度增强,在强力的攻击下保证不可预测性和抵抗力。记住两个要点:你的密码最好包含三个以上的要素;你的密码应该选自有一万亿个可选项的密码空间,具体来说,15~20个小写字母。避免过多使用数字、使用符号分割密码、在第一个字符后使用大写字母。

唯一性准则:你使用的每一个密码,专属于特定的系统,区别于其他所有密码。同时唯一性还包括时间上的唯一性。避免使用常用的字词、避免过于依赖单一的密码、避免使用和自身相关的文字、避免包含重要信息、避免使用可预测的模式。及时更改密码。

保密性准则:坚决不与他人共享你的密码、不以不安全的方式记录、避免在浏览器或软件中保存密码、删除包含了密码的邮件等、随时修改自动非配的密码。


以上,这篇指南就结束啦~希望对大家有所帮助。养成良好的习惯,即使出现了CSDN这样的大规模泄露事件,也不会对自己的个人信息造成太大的威胁。