评论数:109条

如何防止黑客入侵[3]:如何构造安全的口令/密码

  在上一个帖子,俺介绍了攻击者,是如何攻破口令这道关口的。为了避免口令被轻易地破解,有必要了解构造安全密码的技巧。所以,今天就来介绍此话题。


★【不要】共用口令/密码


  俺发现有相当多的同学喜欢靠一个口令包打天下。这是相当相当危险的事情。同一个口令,用的场合越多,则泄密的危险越大。而一旦泄露,你的安全防线就会全面崩溃。
  所以,今天要讲的头一个要点,就是绝对不要在所有(大多数)场合,使用同一个口令。


★密码的【分级机制】


  由于共用口令存在很大的风险,比较稳妥的办法就是——每一个场合仅使用一个密码。但是很多人会抱怨说:这样会很繁琐,增加了很多的麻烦。那如何才能做到既安全,又不太麻烦捏?这就要引入密码的分级机制。
  根据安全圈内一个人所共知的常识:越安全的措施,通常也就越麻烦,成本也高;反之亦然。另外,根据二八原理,非常重要口令毕竟只占少数。所以,就像电影要有分级机制一样,你的密码/口令也要引入分级的概念。通过分级机制,对大多数不太重要的口令,可以采取简化的安全措施;而对少数重要的口令,采取高度安全的措施。
  下面,就来介绍一下,如何对不同的口令,进行分类。

◇第1级:不重要的口令


  所谓不重要的口令,就是说万一被盗了或者忘记了,对你没啥损失。
  比如,俺经常碰到一些土鳖的论坛,只允许注册会员从上面下载附件。因此俺就经常临时注册一个账号,然后登录上去下载东西。这类账号,基本上都属于一次性的(用完即扔),所以重要程度很低。
  对于那些不重要的口令,基本上不用考虑太多安全性的因素。随便设置一个即可。

◇第2级:重要但少用的口令


  对于重要的口令,还要根据其使用的频繁程度,再区别对待。有些口令虽然重要,但是使用的频度很低。由于这类口令很少使用,所以设置得麻烦一些,问题也不大。
  比如俺管理的一些研发的服务器(比如源代码服务器),其重要程度非常高,但是平常基本无需登录。

◇第3级:重要且频繁使用的口令


  最后这类口令,既重要,又经常用。所以,设置这类口令就比较讲究。要同时兼顾安全性和易用性。
  比如自己日常使用的操作系统用户密码,就属于此类。


★一些反面教材——【脆弱】密码的举例


  说完了分级机制。接下来俺先列举一些反面教材,让大伙儿看看,啥样的口令算是脆弱的?(顺便说一下:2011年底,国内各大网站纷纷被脱库,大量用户口令侧漏。俺专门写了一篇博文,分析国内用户的口令习惯)

◇口令和用户名一样


  无需多说,这种情形的口令,非常脆弱。

◇口令是一串简单数字


  在上一个帖子,俺举了RockYou 网站用户数据被盗的案例。在该网站3200万用户中,最受欢迎的十大弱智口令分别是:
1.  123456
2.  12345
3.  123456789
4.  password
5.  iloveyou
6.  princess
7.  rockyou
8.  1234567
9.  12345678
10. abc123

  从这个 TOP 10 可以看出,有一半是采用连续数字。所以,用连续的数字串(包括顺序和逆序)作密码,也是很愚昧滴。

◇口令太短


  如果你的口令小于6个字符,是很容易被暴力破解滴。毕竟,小于6个字符的所有组合,也没多少个。对专门穷举密码程序来说,那简直是小菜一碟。

◇用英文单词作口令


  用【单个】英文单词作口令,也很容易被破解。毕竟,常用的英文单词,也就千把个;算上冷僻的,也就几万个。
  在许多年以前,就有黑客专门收集整理了英文单词的列表(称之为“口令字典”)。而且这个字典是根据单词的使用频度进行排序。有了这种密码破解字典,密码破解程序就可以轻易猜解出那些使用单个英文单词的密码。

◇用日期作口令


  有些同学希望用某个具有特殊意义的日期(比如:生日、结婚纪念日...)作为口令。要知道这种伎俩也是不灵滴。因为常见的日期,大都分布在最近100年的范围内。所以充其量,可能的个数也就大约是365*100个。即便把不同的日期表示格式考虑进去,也多不了几倍。在这个数量级上,对于暴力破解工具而言,还是小菜一碟。

◇其它的烂口令


  上述列举的这几种情况,大伙儿一定要避免。另外,你还可以去围观一下某老外整理的一个滥口令大全(这老外真有耐心)。提醒一下:这个列表是根据欧美用户统计的,未必适合中国的国情。


★如何构造【复杂】密码?


  前面已经说了:口令太简单,容易被破解。但是太复杂的话,万一自己也忘了,那可就完蛋了。所以,很多网友都纠结于口令到底该复杂到什么程度。俺的经验是:口令要做到对自己简单,对别人复杂。
  下面就来介绍俺在这方面的经验。

◇用多个单词构成词组


  前面提到,如果用【单个】英文单词作密码,容易遭受字典攻击。为了避免字典攻击,可以考虑由2~5个英文单词构成密码。如果你英语不灵光或你比较习惯中文,也可以考虑用2~5个汉字的拼音来构成密码。

  优点
  由于能显著增加密码长度,可以抗击暴力破解。
  缺点
  有可能需要改变你记忆密码的习惯。
  口令中仅包含字母,复杂度不够高。

◇插入特殊字符


  刚才提到了用多个单词或汉字拼音构造密码。为了让密码的强度再好一些,还可以在单词或汉字拼音之间,插入一些特殊字符。
  最常见的是插入空格。当然,你也可以考虑插入其它字符(比如:下划线、减号、斜杠、井号、星号、等)。
  通常进行暴力破解时,为了加快破解进度,都只针对字母和数字进行暴力破解。如果你的口令中含有特殊字符,会大大提高攻击者的难度。

  优点
  由于口令包含较多特殊符号,复杂度大大提高。
  缺点
  很多特殊字符的输入,要依赖于 SHIFT 键辅助。对于键盘指法不流畅的同学,可能会影响你输入密码时的击键速度,给偷窥者留下可乘之机。

◇字符变换


  所谓的字符变换,就是用形状类似的字母和数字进行相互替换,通过这种变换,可以规避前面提到的基于口令字典的攻击。
  常见的变换有如下几种:
字母o 和 数字0
字母l 和 数字1
字母z 和 数字2
字母s 和 符号$
字母g 和 数字9
字母q 和 数字9
字母a 和 符号@
字母b 和 数字6
字母x 和 符号*

  假设俺想用单词 program 作为口令,那么经过上述的变换之后,就成为 pr09r@m
  很明显,变换之后的口令同时具有字母、数字、符号。强度相当好 :)
  以上变换仅仅是举例。你可以对俺给出的这几个变换,进行扩展,以满足自己的习惯与偏好。

  优点
  【不用】改变你原先的记忆习惯。
  由于口令包含较多特殊符号,复杂度大大提高。
  缺点
  如果你想好的口令中,恰巧所有字母都没有对应的变换,那就比较不爽啦。

◇键位平移


  这个招数也比较简单,就是在进行键盘输入时,把手【向右】平移一个键位。通常咱们在盲打时,两只手的食指分别对着字母 F 和字母 J。平移之后,则食指对着 GK
  假设俺想用单词 program 作为口令,那么经过上述的变换之后,就成为 [tphts
  经过这种输入法,口令已经面目全非。但是对你自己来说,并不难记。

  优点
  【不用】改变你原先的记忆习惯。
  口令看起来完全没规律。
  缺点
  依赖于 QWERT 的键盘布局。万一哪天你想在非 QWERT 键盘(比如某些手机键盘)上输入口令,那你就歇菜了。

◇藏头诗


  在某些古代小说的情节中,经常可以看见藏头诗的桥段。藏头诗的点子,也可以借用来构造安全口令。
  为了用此招数,你先要想好一句令你印象深刻的话。这话可以是中文,也可以是英文、法文、火星文......反正只要是你熟悉的语言既可。最好这句话的字数(单词数)在8~20之间。然后你把这句话每一个单词的头一个字母取出来,组合成一个口令。如果是中文的话,就把每一个字的拼音的声母取出,组合成口令。
  假设俺想好的话是:“只有偏执狂才能生存”。那么用拼音的声母表示就成为 zypzkcnsc

  优点
  【不用】改变你原先的记忆习惯。
  口令看起来完全没规律。
  缺点
  口令中仅包含字母,复杂度不够高。
  如果句子中的字数(单词数)不够多,效果就不够好。
  对于港台的同学,由于没学过汉语拼音,只好用英文的藏头诗了。好在港台的英语教育通常比大陆好,应该关系不大 :-)

◇巧用 SHIFT 键


  在构造口令的时候,适当地组合一下 SHIFT 键,有时也可以达到不错的效果。假如你的口令中,有部分字符是数字,那当你输入口令时,按住SHIFT键会让这些数字字符变为特殊符号。

  优点
  【不用】改变你原先的记忆习惯。
  由于口令包含较多特殊符号,复杂度大大提高。
  缺点
  万一你原先的口令仅有字母,没有数字,则密码的强度会稍微打折扣。
  由于要依赖于 SHIFT 键进行切换,会影响你输入密码的击键速度。这会给偷窥者留下可乘之机。

◇运用数学等式


  还有一种又好记,看起来又复杂的密码构造方式——运用数学等式。
  比如,可以把密码设计成:7+8=15
  虽然只有6个字符,但是由于包含了符号,已经有一定的强度。如果你觉得6字符太少,可以很容易增加字符数及复杂度,比如改为:37+(9*2)=55
  如果你觉得还不够复杂,还可以搞得再变态一点——把某个数用英文表示。比如:two+7=nine

  优点
  密码同时包含了字母、数字、符号。标准的高复杂度!
  缺点
  需要改变你记忆密码的习惯。
  一旦你的口令被别人看到,别人很容易就可以发现你构造口令的规律。

◇利用散列值(哈希函数)


  最后,来说一种俺的看家本领——利用散列值构造口令。
  不熟悉 IT 技术的同学,可能不了解“散列值”是啥玩意儿。俺不想多浪费口水解释,好奇的同学请看俺的另一篇博文《扫盲文件完整性校验——关于散列值和数字签名》。
  要构造基于散列值的密码,有好几种散列算法可供选择。对于不太懂技术的网友,俺建议用 CRC32 散列算法。为啥用它捏?因为这玩意儿操作起来比较方便。比如,假设俺想得到某个文件的 CRC32 散列值,只要用 7-Zip、WinRAR 之类的压缩工具,把它压缩成 zip 格式的文件,然后就可以看到该文件的 CRC32 值了(因为 zip 格式用 CRC32 散列算法作为文件的校验码)。不信你随便拿手头一个 zip 格式的文件打开来看看就明白鸟。
  因为 CRC32 生成的散列值比较【短】,对于懂技术并且安全要求较高的网友,可以用散列值【更长】的散列算法(比如:MD5、SHA1、SHA256 ......)。
  现在,详细说一下基于散列值的密码如何构造(以 CRC32 为例,其它散列算法依样画葫芦)
  首先,你先想好一个字符串,作为计算散列的种子。这个字符串不需要很复杂,也不需要很长。比方说你叫张三,那你可以拿张三的拼音声母 zs 作为【种子串】(注:此处纯属举例,实际情况中,你应该用【更长】的字符串作为种子串)。
  接下来,假设你有一个 hotmal 的邮箱,需要设置口令。你可以先用记事本(notepad)生成一个 txt 文件。里面先写上种子串 zs 再写上 hotmail,存盘。然后把这个 txt 文件用工具压缩成 zip 格式,看一下它的 CRC32 校验码 9C9041C0,然后就拿它作为密码。
  如果你再有一个 gmail 邮箱需要设置口令,只要同样地,新建一个 txt 文件并写入 zsgmail,同样计算 CRC32,就可以得到另外一个值 03B2F77D。大伙注意到没有?这两个值看起来没有任何关联性,而且从这两个口令,也看不出和种子串 zs 有啥关系。

  优点
  密码同时包含了字母、数字,但是没有特殊符号。复杂度属于中高!
  由于散列值具有随机性。也就是说,你看到的绝大多数散列值都没啥规律。
  由于散列值具有不可逆性。也就是说,即便有一个密码暴露了,攻击者也看不出规律。
  即使有一个密码暴露,别人完全看不出规律。
  缺点
  这种密码是完全随机的,常人是【不可能记住】滴。所以,在密码分级机制中,它仅适合第二级的密码。第三类密码没法这么玩。

  此招数的进阶:
  1. 你可以把 CRC 算法换成其它散列算法(比如: MD5、SHA1、SHA256 ......),就可以轻易构造出【超长的】密码或口令(几十个字符,甚至上百个字符)。
  2. 如果你自己会写点小程序或小脚本,你可以进行 N 次散列(N 可以是几千或几万)。这样一来,别人拿到你的某个密码后,更加难逆向分析出你的“种子串”。因此也就无法分析出由种子串构造出来的其它密码。


★结尾


  今天又花了不少篇幅,总算把俺平生积累的,关于如何构造复杂密码的经验,都讲完了。如果哪个网友还有其它独到的经验,希望来信和俺分享。如果俺觉得实用,也会补充到本文中。
  本系列的下一个帖子,会说说安全漏洞的基本防范


回到本系列的目录
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者编程随想和本文原始地址:
https://program-think.blogspot.com/2010/06/howto-prevent-hacker-attack-3.html