扯蛋的密码规则

原文作者:Jeff Atwood

在很多很多关于密码的糟糕事情中,你知道最扯的是什么吗?密码规则!

2015年8月11日,我曾在twitter上说过:“在我的有生之年,如果我们没有帮用户解决密码问题,我死后变成鬼,也要缠着你!”

今日我再提让这句誓言,想让它成为互联网上的永久记录。我不知道是否有来世,但我很快就会知道的,我打算如地狱恶魔般出来游荡……

这世界充斥着糟糕透顶的密码规则(例如:https://github.com/duffn/dumb-password-rules)。唉,不提也罢!你越是使用真正随机的密码产生工具(想必我们这样的极客都在用吧),你越有可能在这种机制下承受过巨大的痛苦,而且这种痛苦日复一日地还在继续。

xkcd.com上看过这样一幅关于密码的漫画吗?

经过20年的努力,我们已经把所有人成功驯化成:
使用人类难以记忆而电脑容易猜到的密码。

我们当然可以对“correct horse battery staple”这样的密码策略是否有效提出质疑,不过,这里的点主要还是说跟密码长度有关系。

讲真,密码长度确实重要!我竟然在一篇博文里爆粗说道,你的密码太TM短了!如今这个时代,鉴于云计算的发展水平和基于GPU的哈希运算能力,任何不超过8个字符的密码跟不设密码真的差别不大,非常危险!

那么,我们或许有了一个规则,那就是:密码不能太短。长密码比短密码可能会安全得多。是这样吗?

下面这个4字符的密码怎么样?

下面这个8字符的密码又怎么样?

正确马电池订书钉

或者,这种7个字符的密码呢——阿拉伯文、中文、泰文、韩文、克林贡文、Wingdings字体、表情符各取一个字符?

如果你把上面那4个Unicode的表情符,粘贴到你最常用的登录框里——现在就去试一试——你可能会被惊到!你会发现,其实不止4个字符哦……

亲,我们的老朋友Unicode又来捣蛋了!瞧瞧这个:

事实证明,即使像“密码必须要有合理的长度”这样的简单规则,也未必就这么简单。尤其是,如果我们不像脑子里只有ASCII字符的老美那样思考问题。

话说回来,那些看起来不错的长密码呢?它们就一定安全吗?

aaaaaaaaaaaaaaaaaaa

0123456789012345689

passwordpassword

usernamepassword

当然不是!你最近接触过用户吗?

他们孜孜不倦地摧残着我开发的软件,简直无孔不入。是的,没错,我知道你们极客非常清楚“熵”的概念(注:熵的本质是一个系统“内在的混乱程度”)。但是,在一个Unicode和表情符的世界里,把你们对熵的热爱表达成下述稀奇古怪、糟糕透顶的密码规则,真是凭空想象出来的一个巨大错误!

  • 必须包含大写字母
  • 必须包含小写字母
  • 必须包含一个数字
  • 必须包含一个特殊字符

在我们开发Discourse.org的时候,我发现,登录框是非常复杂的一块代码,尽管它的界面看起来很简单。我们采用的主要密码规则也是最简单的,就只有长度要求。从最初的开发到现在,我们已经把密码的最小长度要求从8字符提升到10字符。如果你有幸成为管理员或版主,我们还决定密码长度最少必须15个字符。

我同时也主张,拿用户的密码跟10万个最常用的密码进行比对。如果你看一看2016年被曝光的1000万个密码,你会发现用得最多的前25个密码是:

123456

123456789

qwerty

12345678

111111

1234567890

1234567

password

123123

987654321

qwertyuiop

mynoob

123321

666666

18atcskd2w

7777777

1q2w3e4r

654321

555555

3rjs1la7qe

google

1q2w3e4r5t

123qwe

zxcvbnm

1q2w3e

纵然这份数据泄漏了一些ASCII中心主义。我想,数字在任何文化里都是相同的,但我难以相信普通的中国人会选择“password”、“qwertyuiop”或“mynoob”作为密码。因此,上面这份清单必然还会因地区而异。

(一个有趣的想法是,在长密码里去检索匹配常用的较短密码,不过,我觉得这会产生太多的误报。)

如果你再次检视这份数据,不难得出一个支持密码长度的结论。请注意,在最常用的25个密码中,只有5个超过10字符。因此,如果我们要求密码长度至少是10,就已经把上黑榜的几率降低了80%。我最早是在为Discourse.org做调研时意识到这一点的,那时我收集了数百万个泄漏出来的密码,然后把这份清单过滤到只剩下满足我们新的最低要求(10个字符或更长)的那些密码,真的是寥寥无几了!

在此,我想对我们的程序员小伙伴们提几点常识建议:

1.  密码规则就是扯蛋

  • 它们没卵用!
  • 它们严厉惩罚了你的理想用户——使用真正的随机密码生成器的那些人。你猜啥,那些随机密码可能不包含数字或符号。我刚刚翻了一下数学教科书,确认了,这是有可能的。我很肯定!
  • 它们给普通用户带来挫败感。然后,他们就暗生排斥心理,耍起了小聪明,结果使得他们的密码安全性变差。
  • 它们还常常错误百出,所选的规则非常不完整,甚至很愚蠢。
  • 不开玩笑,看在上帝的份上,趁早抛弃这种没心没肺、毫无道理的密码规则吧。如果你不信我的话,看看人家的这份建议。人家也说了,“别用组合规则”。不过,我确实发现一个问题——应该说是,“别用扯蛋的组合规则”。

2.  密码要支持Unicode,并强制要求最小长度

这条规则,最起码很容易记,也容易理解和实施。至尊规则唤众戒,众戒归一黑暗中。

  • 它很简单。用户可以数。好吧,大部分人都能数。
  • 它行之有效。已经有数据证明了这一点。你随便去下载一份常用密码清单,然后按密码长度分组,一目了然。
  • 需要明白一点,即使这条规则也不是无懈可击的。在一个中文网站上要求最小密码长度为6可能已经够好了。而一个20字符长度的密码可能极不安全。
  • 如果你不允许在密码框里输入任何Unicode字符,你可能就在犯错。
  • 还有一个实现方面的细节,就是要确保密码的最大长度也要合理。

3.  与常用密码进行校对

前面我已经提到过,所谓“常用”,跟你的用户和语言有关。但是,如果你让他们从最常用的1万、10万甚至100万个密码中挑选自己的密码,那就等于在坑他们。毋庸置疑,黑客在攻击行动中会利用这些常用密码。纵然你对密码的重试频次有积极的限制措施,只需用1000个最常用的密码来碰撞,你又能扛得了多久呢——结果非常令人震惊!

  • 1.4%的人使用了最常用的10个密码
  • 4.4%的人使用了最常用的100个密码
  • 9.7%的人使用了最常用的500个密码
  • 13.2%的人使用了最常用的1000个密码
  • 30%的人使用了最常用的10000个密码

你很幸运!成百万个遭曝光的真实密码在那里等着你去筛选。做这种数据分析还是有点意思的,因为这些不是某些无聊的程序员凭空捏造出来的密码规则,而是被用户真正使用过的真实密码。

研究一下吧。收集一下数据。别让你的用户把自己坑了。

4.  检查基本的熵

别异想天开!关于熵的衡量,你内心深处觉得对就行。但是请记住,当用户无法通过规则检查时,你必须能向他们解释清楚。

我有点难过,因为我们曾经毫不介意用户选择像“aaaaaaaaaa”这样的10字符长度的密码。在我看来,最简单的解决方法是设定一个像“总共y个字符中至少需要x个唯一字符”的规则。在Discourse.org的beta版里,我们就是这么干的。如果你有更好的主意,欢迎留言给我。越简单清晰,越好!

5.  拒绝特殊密码

我感到羞愧难当,但我还是得承认:我们在早期开发Discourse.org登录模块的时候,忽视了必须要阻止的两种常见情况:

  • 密码与用户名相同
  • 密码与email地址相同

与此类似,你可能也应该阻止其他的特殊情况,比如:

  • 密码等同于URL或网站域名
  • 密码等同于App名字

简而言之,试着跳出密码输入框去思考,就像用户那样。

时间: 2024-12-12 12:12:42

扯蛋的密码规则的相关文章

CSDN日报20170409 ——《扯蛋的密码规则》

[程序人生]扯蛋的密码规则 作者:陆其明 在很多很多关于密码的糟糕事情中,你知道最扯的是什么吗?密码规则! 2015年8月11日,我曾在twitter上说过:"在我的有生之年,如果我们没有帮用户解决密码问题,我死后变成鬼,也要缠着你!" 今日我再提让这句誓言,想让它成为互联网上的永久记录.我不知道是否有来世,但我很快就会知道的,我打算如地狱恶魔般出来游荡-- [图形渲染] <Real-Time Rendering 3rd> 提炼总结(一) --全书知识点总览 作者:毛星云

[扯蛋] 项目说

写过项目的朋友应该都有这样的感觉,在架构规划的时候是这样的. 在写的时候也是严格要求自己,尽量规范,尽量注释等等. 但是在PM一再要求改需求,改页面的时候,我们只能这样做了. 呵呵. 其实谁都不想这样,因为最后累的还是我们自己,但是有时候却是没办法的事情.因为时间非常紧迫,只能把功能先搞出来,然后回头去慢慢改.但是我们只做了前一步,回头去改,这一步很难做到,因为下一个任务又会迫在眉睫.所以整个项目就会非常凌乱. 特别是在多人开发的时候,往往都是自己写自己的东西,公共函数库从来都不看,用到一个自己

[扯蛋] 学习方法与态度

今天挤了3个小时公交才回家,身心疲惫啊,不写技术了,来扯蛋吧. 记得五一期间,一朋友老是问我40岁的程序员还有人要么?都快30了写代码还有前途么,然后这个问题他纠结了一个星期.我觉得这个完全不是一个问题,因为只要热爱这个东西,你做到60岁都可以,谁规定40岁就不能写代码了?那些说40岁的程序员没人要的,其实只是三流码农做为失败者的托词而已,他们写到40岁了,其实还不如一些20多岁的牛人呢. 我觉得一切都是兴趣使然,你热爱代码,就等于享受编码的过程,上班也就成了享受,这是多么美好的状态.然而90%

自定义SAP用户密码规则

一般实施SAP的公司因为安全性问题都会启用一定规则的用户密码强度,普遍的做法是让Basis在RZ10里面给系统参数做赋值,然后重启服务来实现对所有用户的密码规则的定义.但这样的话对所有用户有效,没办法例外控制某一些特别的用户.比如老板.董事长或高管等用户,或许不需要强制规定密码长度,不需要输错几次就锁定,不需要设置密码有效期等.那么基于以上需求,该如何来实现不同用户不同的密码规则呢? 以下通过几个操作来实现: 一.创建安全策略 事务代码:SU01,选择一个用户之后,回车进入到登录数据页签: 双击

一场由于ssl证书过期造成的扯蛋加班

昨天中午,突然有反映app客户端无法登录,注册.由于监控还不到位,所以没有第一时间知道,发现问题后,首先检查日志,发现有大量的'peer closed connection in SSL handshake while SSL handshaking,''client closed connection while waiting for request,' 以前没有解决过此类报错,百度和google也没查到解决的办法,只是说ssl握手不成功,但由于大量的用户无法登录,同时在出现问题的前一天又做

去你妹的密码规则

公司企业邮箱改用了腾讯的, 重新设置密码, 这SB玩意的密码规则还必须包含数字字母, 而且还TMD同时需要有大小写字母 TMD老子在网上混了这么多年就没用过同时包含大小写字母的密码, 你TMD一个密码规则我就必须记个新密码出来 怕泄密老子自己会创建复杂密码, 用不着你个破企鹅在这强制设置规定 去你妹的密码规则 规矩太多会被人骂祖宗十八代的

SEO高手在扯蛋?

真正的高手SEO你在扯蛋吗?当大家都很会扯的时候,高手扯得肯定比你疼,不是他们 蛋比较敏感,而是他们的确更用力. 当你说我是SEO时,高手肯定说现在我在做的是SEM. 当你说我是SEM时,高手肯定在说我现在在做 MKT. 你怒了:为什么你总走在我前面? 高手看着你无辜的眼神:因为你比我先说! 你说我做热词排名,高手说我在做长尾建设. 你说我在群发长尾链接,高手说我在做站内优化. 你在说我在做站内优化,高手说我在做整站架构. 你说我在做整站架构,高手说 我在做数据分析. 你说我在做数据分析,高手说

centos服务器密码规则自定义

随着linux使用的普遍,对于linux用户以及系统的安全要求越来越高,而用户密码复杂程度是系统安全性高低的首要体现.因此如何对linux下用户的密码进行规则限制,以保证用户必须使用复杂的密码,杜绝用户随意使用简单的密码,从而提高用户的安全性和系统的安全性. 要想修改服务器默认的密码规则,需要修改/etc/pam.d/system-auth文件如下:修改/etc/pam.d/system-auth文件,将文件中的 password requisite pam_cracklib.so try_fi

修改AspNetSqlMembershipProvider的密码规则

在AspNetSqlMembershipProvider中,默认的密码规则为长度大于等于7,并且包含1个除字母和数字外的特殊字符,这项规则主要由minRequiredPasswordLength和minRequiredNonalphanumericCharacters两个参数控制.minRequiredPasswordLength控制密码长度,minRequiredNonalphanumericCharacters控制非数字字符的个数.更改密码规则修改这2项参数即可,如下配置为密码长度大于等于3