为什么密码设置为「jK8v!ge4D」仍然不安全?
如果你仔细留意的话,你会发现,在大多数平台上,当你创建账号时,平台或系统会对你的账号密码设置设定一系列要求。其中,最常见的就是,密码设置必须包括一个大小写字母、数字和特殊符号,并且密码不得少于 8 个字符。然而,这并不是安全的密码设置方式。这篇文章,原标题是 Why jK8v!ge4D isn’t a good password,前端开发师 Jacob Bergdahl 在文章中分析了这种密码设置方式的不安全性,同时又跟大家分享了一种更安全的密码设置方式,希望对你有用。
首先,请仔细看看下面两组密码。你认为破解哪组密码更简单呢?你认为哪组密码更方便记忆呢?
- jK8v!ge4D(含大小写字母、数字和符号)
- greenelephantswithtophats(戴着礼帽的绿色大象)
对于这个两个问题,无论从破解容易度,还是记忆方便度来说,答案都是第二组密码。
然而,在各种互联网的各种平台上,我们仍然在采用看起来像第一组密码的方式来设置密码。大家都想当然地认为,只要密码设置地过于复杂,不方便记忆,那这个密码就不容易破解。
接下来,我们就详细来聊聊这个话题。
在互联网标准方面,实际上存在许多奇幻的事情。其中,就包括验证。作为一名前端开发者,我的工作就包括去验证用户输入在那些所谓 「输入框」 中的内容。这些所谓的输入框,包括用户名、邮箱地址、家庭住址、电话号码等等。
作为前端开发者,我们的工作职责就是要保证用户在使用我们的产品过程中,不会恶意输入或者错误输入不符合既定格式要求的文本内容。
例如,邮政编码文本框通常就只允许填入空格和数字。如果我们知道用户来自哪个国家,我们还可以对这个文本框的格式做出更加明确的限制。电话号码文本框通常都包括一系列数字,一个加号符号(通常都在最前面),以及一个破折号,有的情况下可能还包括圆括号。
邮箱地址的验证就相对麻烦。然而,常规的做法是,它必须包括 「@」 符号,然后后面还需要包括一个小数点。在某些网站,他们会要求用户在填写用户名的过程中,限制用户填入的名字字符长度,有的还会限制其只能选用某些特定的字符。
验证之所以存在,主要是基于以下几个原因。
- 首先,安全因素。验证可以防止用户在文本框中输入乱七八糟的信息,从而增加改变数据库或者引发其它恶意行为的可能性。
- 其次,它可以确认某种特定的数据类型。如果某个文本框只能包含数字的话,数据库工程师就可以以此来建立一个仅含数字的数据库。这即意味着,如果出现了非数字字符的话,就可能会出现错误。
- 然而,验证存在的最核心原因,实际上是帮助用户避免错误。
用密码设置规则来迫使你设置密码
从某种程度上来讲,前端开发者应该为用户提供全方位的帮助,让用户设置并输入一个从传统意义上来讲非常安全的密码。它至少应该包含 8 位字符,其中还包括大小写字母、一个数字,如果还没有安全感的话,甚至还可以加入感叹号等特殊符号。
基于此,「jK8v!ge4D」 通常都会被视作是一个非常安全的密码典范。毫不夸张地说,在绝大多数的互联网平台上,平台都会要求你按照这种模式来设置密码,因此,你可能就会认为,这种组合的密码就是非常安全的密码。
然而,这种组合的密码并不安全。它反而是非常愚笨的密码设置方式,是一个极容易被破解的密码。
首先,这种密码设置方式,会增加用户记忆密码的复杂程度。他们很有可能无法记住自己设置的密码,从而 「另辟蹊径」,在笔记本或者其它地方把这个密码记录并保存下来,而这种方式也很容易被他人 「破解」。
其次,由于大多数密码都采取这样的密码设置组合,就复杂性而言,已经是其心目中的复杂密码了。因此,为了避免不必要的麻烦,他们可能会在各种平台和设备上都采用相同的密码。
当你在某个网站上创建账号时,后台的一些 「神奇魔法」,会将你设置的密码转变成一串散列(散列也 经常被错误地视作为加密技术)。通过这么一个步骤,你设置的密码,可能在数据库中就会显示成这样:k5ka2p8bFuSmoVT1tzOyyuaREkkKBcCNqoDKzYiJL9RaE8yMnPgh2XzzF0NDrUhgrcLwg78xs1w5pJiypEdFX。
即便数据库被黑客入侵,黑客拿到这些散列也无法提取有用的信息。如果密码设置非常大众化,并且相关算法也非常简单的话,那仍然有可能根据这个散列来破解原密码。不过,只要密码设置妥当、散列生成过程也正常的话,它大体上仍然是非常安全的。
但问题在于,不是所有的平台或者设备都会为用户的密码生成散列。如果你把相同的密码用于多个平台和设备的话,也许你使用的某个平台其后台编码非常简单,而你的密码也是直接一字不差地以原密码文本形式存在于其数据库中。如果他们的数据库遭到攻击,那你可能会暴露所有平台和设备上相同的密码。这么说来就相当可怕了,而实际上,真实情况比我们想象的还要可怕。
因此,我个人建议,对于不同的平台,还是要设置不同的密码。值得注意的是,如今大多数用户在各个平台上都有大量的账户,如果设置不同的密码,怎么才能记住所有的密码呢?一些超级用户可能会使用密码工具,来帮助其生成并管理密码,但一般用户基本上都没有这么做。
实际上,其实还有更好的密码设置方法。
▲ 图片来源:Pexels.com
破解密码需要多久?
我们先看看 「gtypohgt」 这个密码。它由八个随意的字母符号组成,全部都是小写字母。对于这种密码,要破解它只需要几分钟的时间。
如果把其中某几个字符换成数字,比如 「g9ypo3gt」,那破解时间至少就需要一个小时了。如果再把其中的小写字母换成大写字母,比如 「g9YPo3gT」,那可能需要几天才能破解成功。另外,如果你再往里面添加一个特殊字符,比如 「g9Y!o3gT」,那可能破解这个密码都需要一个月的时间。
「g9Y!o3gT」 这个密码设置组合,就是我们通常所认为的安全密码。这样的密码设置,很难被他人猜到,也完全不属于常规设置密码。要破解这样的密码,的确需要一定的时间。但问题在于,这样的密码设置,会直接增加用户的记忆难度。
然后,我们再看另一组密码 「greenelephantswithtophats(戴着礼帽的绿色大象)」。这组密码包括 24 个小写字母,没有数字、随机字母和特殊字符。虽然你会认为这样的密码设置非常简单,但要想破解这样的密码,可能需要至少上百万年时间。
所以,只要你在密码组合中增加一个字符,破解这个密码的难度实际上是在呈几何数增长。前述 24 个字符的密码,并不像一般的 「666888」「elephant(大象)」 等常用的密码,而且也很难让人猜测。
这才是安全的密码
因此,我建议,设置密码,最好就让这个密码变成一个故事。比如,在设置 Facebook 账号的密码时,你可以使用 「afaceforabookbutapizzaforahorse(书有一张脸,但马有一个披萨)」。总之,最好通过视觉呈现的方式来设置你的密码。
我们的记忆强项,反而就是在这些特殊内容的记忆方面。突然之间,你的密码就非常强大了,而且不仅记忆方便,而且还可以避免过于重复。此外,即便是跟你关系密切的人,恐怕也很难去猜测这些密码。
日常谈话中,你肯定很少会提到乌龟吧?那你是否见到过紫色的乌龟呢?肯定没有吧。那么,不妨尝试下,在脑海中视觉呈现一只紫色的乌龟。然后你就可以这样设置一串密码:「ioncesawapurpleturtleiswear(我发誓我曾经见过一只紫色乌龟)」。要破解这样的密码,至少需要上百万年的时间,甚至连跟你睡在一张床上的伴侣都可能猜不到。
对于 「walkingdowngrandpasroadwithlittlerufus (和鲁夫斯一起在爷爷家门前走过)」 这个密码,破解可能需要上百万年时间。即便有人知道鲁夫斯是你的宠物狗,他们也很难猜到你会这样来设置密码。图片来源:Jamie Street
从视觉化效果方面来讲,以下这些密码都非常容易呈现出来。
- flyingcarsthatcannotflyarenotflying:如果不会飞的汽车就不是飞车。
- applesmaybegreatbutpearsarelikeheaven:苹果虽然好,但梨子却更好。
- goatswithshoesenjoytrainsonrainydays:穿鞋的山羊喜欢在雨天搭火车。
总之,其他人很难猜测这些密码。
然而,可能有些网站会不允许用户这样设置密码。根据其设定的密码设置规则,这个密码中没有包含数字或大写字母、密码过长,或者处于其他非技术因素无法设置该密码。
因此,你也可以通过一些小伎俩来 「骗」 这个系统。比如,在任何密码字符串的最后添加 「A1!」。现在,你设置的密码既有大小写字母,也有数字和特殊字符了。只要密码设置没有对字符长度有要求的,那这个密码肯定就可以设置成功。
即便你在所有的密码字符串后面都添加同样的 「A1!」,但前面字符串的不同,仍然会保障该密码的安全性。无论是 「ioncesawapurpleturtleiswear(我发誓我曾经见过一只紫色乌龟)」,还是 「ioncesawapurpleturtleiswearA1!(我发誓我曾经见过一只紫色乌龟 A1!)」,要想破解它们,都是不太可能的。因此,在密码字符串的最后加上 「A1!」,除了稍微有点不方便之外,没有其它弊端。
实际上,前端开发者之所以制定相关密码设置规则,其初衷也都是好的。毕竟,许多人并不重视密码安全问题,通常都会设置 「123456789」「666888」「elephant(大象)」 等极其容易破解的常见密码。
对于网站运营方而言,他们肯定不想发生任何数据泄露相关的丑闻。因此,即便可能会造成一系列麻烦,但他们只好强迫让用户设置一个相对安全的密码。
当你下次设置密码的生活,你可以尝试用本文中提到的技巧来设置你的密码。当然,结合此方法,你也可以用拼音的方式来设置密码。比如 「wofashiwocengjingjianguoyizhizisewugui(我发誓我曾经见过一只紫色乌龟)」。
总之,在密码设置过程中,既要方便你自己记忆,同时要让别人无法破解。
当然,即便你对这样的密码设置技巧不感兴趣,那你最好千万不要设置 「123456」「qwerty(顺着键盘按键随意输入几位字符)」 等密码。这些密码,极度不安全,也非常容易被破解。对于这样的用户,我们前端开发者只好强迫你设置 「jK8v!ge4D」 这样的密码。
本文来自 36 氪旗下编译团队神译局,译者俊一,爱范儿经授权发布。