如何选择一组高安全性的密码?

04.20.2020  - 作者  在 安全性

根据 2017 年《华尔街日报》的一篇文章,前美国国家标准技术研究院(NIST)工程师 Bill Burr 对于其在 2003 年为该研究所撰写的报告感到后悔。

然而,他有一个很好的理由。

您可能不知道这篇 NIST 是个什麽样的报告,但这篇报告中的提出的建议可能对您来说是很熟悉的,如果确实是如此,您可能知道 Burr 为什麽对该篇报告广为流传而感到后悔。

2003 年的建议与如何拥有强大的密码策略有关。他们提出了这样的需求,密码中应该要包含大写和小写字母,最低长度限制的数字和特殊字符,以及每 90 天需要变更一次密码。

这些策略的结果使得密码变得了无新意:用户会在便条纸上写下他的密码,并黏贴在其萤幕上。他们通常会在他们旧密码后方加上 1、2、3,4 等数字来 “变更” 成新密码,或是写出像是 I33t 的字词,因为它的发音唸起来就像 ‘p@$$w0rd’。

Burr 告诉华尔街日报,他没有被授予用户数据的访问权限,只能根据从 1980 年代 NIST 文档中所传承的最佳做法提出建议。这不仅是因为该建议与来自 2003 年 .com 的泡沫后的情况不太相同。主要问题是,他没有办法针对用户的真实体验来改变这种已广为人知的智慧。

Burr 在 2017 年向《华尔街日报》认罪后不久,NIST 修改了这些建议,但是 “好的” 密码建议的问题在于,它通常只专注于防御单一威胁,即攻击者可以访问密码文件,而且通常会忽略所有安全性中最弱的连结:用户。

导致的结果是,有关密码的建议溷乱不清,这些建议常规性地被消化和检视,其一般结果与 NIST 2003 年的建议相同 — 一种错误的安全感,它仅透过考虑密码複杂性来平衡帐户安全性。

不要误会我们的意思。拥有複杂的密码一样是件重要的事。但是,全面性地考虑密码组成的问题更是重要。在本文中,我们将研究常见的密码建议,为什麽人们推荐它,以及它们有什麽样的问题。

在此过程中,我们将尝试提供那些 Burr 后悔无法在 2003 年为您提供的有关如何设计密码的有用信息。

1. 使用特别的字符

为什麽这样建议呢?

大多数关于密码安全的方法是倚赖 ”熵” 的概念。这个看起来深奥的字其实原理相当简单 – 熵是一种衡量密码的不可预测性的方法。更具不可预测性又意味着,掌握密码文件的人需要更长的时间去破解您的密码。 熵的原理取决于您使用的字符和密码的长度。

可以透过找出每个字符的熵来找到密码的熵。如果您对数学感兴趣,则字符的熵是所使用字符集中的字符数的对数 2,乘以密码中的字符数。

如果这听起来对您来说太複杂了,请不要担心!重要的是其背后的理论,以及由这个原理衍生出来的建议。

八位密码组合

字符集
字符数
组合数
字典单词 600,000 种组合
0-9 10 个字符 100,000,000 种组合
a-z 26 个字符 208,827,064,576 种组合
A-Z, a-z 52 个字符 53,459,728,531,456 种组合
A-Z, a-z, 0-9 62 个字符 218,340,105,584,896 种组合
所有允许可印刷之字符 72 个字符 1,853,020,188,851,840 种组合

上方图表简单地向您介绍了熵的概念。使用更大的字符集能够产生出更多种可能的组合,也就是说,理论上来讲,攻击者必须尝试更多组合才能破解您的密码。

有什麽样的问题呢?

对于 8 个字符组合的密码,熵的计算会假设该密码是随机的,因此会在数字中包含任何特殊字符,或是大小写字母,让攻击者像在大海捞针般,难以找出所有包含在内的字符。

然而,事实上人类的行为并不是随机的。

‘P@$Sw0rD’ 以及 ‘Q)%Fk6xF’ 这两组密码都是所有允许可印刷之字符的 1,853,020,188,851,840 种可能的组合之一。但是 ‘P@$Sw0rD’ 比 ‘Q)%Fk6xF’ 更有可能成为某人的真实密码。为什麽呢?因为 ‘Q)%Fk6xF’ 并不好记忆。从理论上来看,您可以建立一个助记符设备,或是写一首歌,如果您真的需要这样才可以记住该密码,但事实上您很可能没有时间这样做。

这也是为什麽,当您专注在密码的複杂性上时,’P@$Sw0rD’ 更有可能成为您设定的密码。更糟糕的是,’P@$Sw0rD’ 是历史上最流行的密码之一,为 ‘password’ 的变体,因此攻击者在破解密码时更有可能先尝试这组密码。

‘Q)%Fk6xF’ 是一组安全的密码,但是很难记忆。如果这组密码是要使用在工作上,可能对您来说并不是那麽重要,但对您的老闆来说却是相当重要,然后您可能为了要记下这组密码就把它写在便条纸上,并把这张便条纸留在您办公桌上。这样的行为实际上也缺乏安全性。

换句话说,使用具有 ”複杂性” 的密码不见得对您有力,因为

  1. 密码本身只是一个容易被破解的密码的变体,而且
  2. 你记不起这组密码!

结语

如果可以,请务必在密码中使用特殊字符、数字,或大小写字母。但是,请勿使用像是 l33t 这类型的密码,把 O 替换为 0,将 A 替换为 @ 或 4 等等。这只会给您带来具有安全性的错觉,但实际上却没有任何安全性可言。

此外,请不要设定您无法记忆的密码!如果您需要把密码写在便条纸上,或是每次都需要重新设定您的密码,那麽一组複杂的密码并无法提供您任何帮助。

那密码金钥呢?

密码金钥是一个应用程式,它可让您为多个帐户生成和储存複杂以及完全随机的密码。我们建议您可以使用一个!现在某些浏览器上已内置此项功能。

这是可以拥有许多高熵密码的最佳方法,您可以轻鬆取得这些密码,而且不需要在每次登入时重置您的密码。

但储存密码时请务必注意。密码金钥 – 例如电子邮件地址 – 会有单点故障的问题。密码金钥公司投入大量资源以确保密码被安全地储存,但是仍可能会有漏洞!也许将所有鸡蛋都放在同一个篮子裡对您来说最合适,但在这种情况下,请记住 – 您所有的鸡蛋都在同一个篮子裡。

2. 设置一组长的密码

为什麽这样建议呢?

另一种增加密码强度的方法是加长密码的长度,因此增加密码长度是您会听到的另一种常见的建议。

10 个字符密码的可能组合

字符集 字符数 组合数
0-9 10 个字符 10,000,000,000 种组合
a-z 26 个字符 141,167,095,653,376 种组合
A-Z, a-z 52 个字符 ~144,555,105,949,057,000 种组合
A-Z, a-z, 0-9 62 个字符 ~839,299,365,868,340,200 种组合
所有允许可印刷之字符 72 个字符 ~3,743,906,242,624,487,000 种组合

您可以看到,只要在 8 个字符的密码中再添加两个字符,就能够产生更多种的组合。一组由 72 个可使用字符组成的 20 个字符的密码即为 14,016,833,953,562,610,000,000,000,000,000,000,000 种组合中的其中一个组合。

当然,与前面所述的相同评论仍然适用于这样 – 如果您在实际上无法记住这组密码的话,它就相对没那麽有用了。

儘管如此,在基本上,您的密码越长越複杂,它的熵就越高,攻击者要破解密码所花费的时间也就越长。

有什麽样的问题呢?

然而,所有的这些都是假设:

  1. 攻击者有权限取得密码文件
  2. 帐户供应商已适当地对密码文件进行单向杂凑处理
  3. 帐户供应商已妥善地加密密码文件

让我们来分解一下:

首先,攻击者必须取得密码文件的访问权限。为此,他们必须透过某种攻击来破坏储存密码文件的系统。

接着,如果帐户的供应商没有适当地对密码文件进行单向杂凑处理,就意味着该密码文件只是以纯文本或明文形式储存。

举个例子来看,在去年,Facebook 被举报其密码以明文形式储存(而非单向杂凑处理)。如果攻击者取得密码文件的访问权限,无论您的密码设置的多长或多複杂,您只有一个选择:尽快变更您的密码。

单向杂凑指的是使用特定算法对密码进行加扰的特定过程,因此,如果密码文件遭到破坏,密码本身也不会被洩漏。

但是单向杂凑处理还是对这些额外添加的字符所增加的安全性有一定的影响。

其中一种热门的杂凑函数称为 bcrypt。 它特别能抵抗暴力攻击,因此可以延长攻击者破解密码所需的时间。 但是,这也对密码的强度设置了上限。

具体来说,该限制为 50-72 个字节,当超过此限制时,您的密码将会被截断,也就是说,密码长度为 72 个字符的密码将被 bcrypt 杂凑处理,与密码长度为 73,84 或 104 个字符的密码也一样。

最后,杂凑处理的密码需要被加密。

预先计算的杂凑函数表的存在 – 称为 ”彩虹表” – 意味着杂凑函数的单一存在是不够的。

这就是为什麽需要加密的原因。透过加密处理,网站将其它随机字符串添加至杂凑密码中,以破解破坏杂凑函数的工作。

基于这样的方式,如果密码文件遭到破坏,密码将会更难被破解。但也就表示,如果密码遭到破坏,它仍然是不安全的。因此,请不要继续使用储存在洩露的密码文件中的密码!

结语

您可以使用有史以来,最长最複杂的密码,但是使用该密码的网站是否没有对密码进行杂凑或加密处理都没有关係。即使如此,根据您的供应商所使用的杂凑函数,实际可以使用的时间长度也可能存在着限制。

再一次,请不要使用已经洩漏的密码!

您可以透过 “我被骗了吗” [https://haveibeenpwned.com/] 这类型的网站,确认您的密码是否已经被洩漏。

然而,在没有发生任何违规的情形下,更改您的密码仅代表设定了一组您不记得的密码,并且若在每次登入时都必须重置您的密码,那样的话并不比您可以记住的密码更安全。

这将我们带到下一章节:

3. 选择一组有记忆性的密码

为什麽这样建议呢?

在这裡,开始要考虑到拥有受密码保护的帐户的用户体验。对于密码複杂度的关注而衍生出一些建议,这些建议忽略了用户最重要的一个面向:用户是否能够记住自己的密码。

研究显示,平均用户每週会花费 12 分钟,或每年 11 个小时来输入或重置密码。在工作环境中,将该花费时间乘以所有员工,实际上的成本就会相对增加。

创建一个具有很大熵的密码是有可能的,然而,若要不使其变得如此奇怪,您则需要一个助记符设备来协助您记住它。

尝试溷搭三种不相关的单词,且每个单词的长度都要超过五个字母,像是 ‘FaithfulHighwayPrinter’。您只需要记得这三个词,这三个词越怪越好,如此一来,密码破解者非得尝试数百万次才有可能猜中您的密码。’p@$$w0rd1!’ 这种密码相对来说较不好记,但对密码破解者来说却是非常容易猜中。

您可以使用一种称为 Diceware 的软体去生成一组真正的随机单词集。

您可以在 Diceware 上掷五次骰子 (或一次掷出五个骰子),即可生成一个单词。您可以从 Diceware 列表中找到该单词,该列表提供了易于记忆的随机单词列表。

您甚至可以使用 D-20 和幻想词列表!)

如果这对您来说不够安全,您可以考虑另一个选项,研究人员开发一种技术,该技术被称作 ‘mindhashes’,它帮助您开发自己的人工算法以创建无法往后推敲的密码。

例如,让我们从上方输入我们的 3 字密码 – “FaithfulHighwayPrinter”。 现在,选择一个 “万用字元” 的字母 – 我们说 z。最后是大写字母,数字,符号组合。那就是您的 “特殊字符串”。我们将使用 $O2。

要使用此密码去生成一组密码,请用要使用该密码的那个网站的名称。
然后,您可以在您的 3 字密码中找到该网站名称中的每个字母,并选择有相同谐音的单字。如果您选择的字母没有在您的三个单词,请输入万用字元。 然后再加上您的特殊字符串。

使用上面所述的方式,对于 Gandi 帐户,我们可以生成出这样的密码:

g > FaithfulHighwayPrinter > FaithfulHighwayPrinter > h
a > FaithfulHighwayPrinter > FaithfulHighwayPrinter > t
n > FaithfulHighwayPrinter > FaithfulHighwayPrinter > t
d > FaithfulHighwayPrinter > (letter not present, wildcard) -> z
i > FaithfulHighwayPrinter > FaithfulHighwayPrinter > t

加上我们的杂凑函数,我们会得到:httzt$O2

虽然这并不容易记住,但您不需要特别记住它,只需要计算它。研究表示,在学习曲线之后,用户发现使用这种 “mindhash” 的方式变得越来越容易

有什麽样的问题呢?

同样地,这归结于实际用户的行为。研究人员发现,在野外,人们倾向于选择密码短语 (另一个生成密码的方式),这些通行短语像是 “三隻狗之夜” 或 “抽奖” 之类的常用短语,有时候也可能是运动队伍的名字

此外,密码破解者会尝试找出单词组合,从而使这些密码短语相对的增加。

至于 “mindhashes” 是一个非常有趣的想法,但是理解起来很複杂,执行起来更繁琐。当用户还在选择 “12345” 这类密码的时候,我们真的可以期望他们开始喜欢学习 “mindhash” 而不是生成随机的密码吗?

关键是,密码是基于让人容易记住的方式而产生的。人们重複使用密码,在密码中加入数字,在各个帐户之间共享密码,或与其他人共享密码。这不是人们的坏习惯,这就是一般人的行为。

不要只依赖密码

密码永远都不会完善的。它们是在 1960 年代被发明的,目的是防止电脑工程师之间相互进行恶作剧,而且恶作剧者几乎立刻就知道要如何窃取密码文件。

即使在那时候,密码也没有被认为是在像充满陌生人的複杂网路上提供安全性的一种方式。

正如工程师 Bill Burr 对 NIST 在 2003 年时提出的建议一样,密码安全性通常集中在对强壮的密码的需求 – 一组长又複杂,而且难以破解,但却又容易记得的密码。但这仅解决了一种可能的攻击途径,却忽略了人的天性。

密码也是您线上帐户较为薄弱的环节,攻击者可以透过许多其他攻击媒介进入您的帐户。您可能会被伪装成您信任的网路钓鱼电子邮件诱骗,交出您极长,複杂但容易记忆的密码,或者您的电脑在您无意中下载或安装恶意软体时被安装追踪器。有人甚至可以透过侦听的方式,连结到未加密的网站伺服器以获取密码。

同样地,责任也落在了帐户供应商身上。已经洩露的密码 – 即使它们具有较高的熵 – 也不应再被使用。您可以避免重複使用已经洩漏的密码,并透过限制共享密码的数量来降低多个帐户受到解密的风险。

最重要的一点是 – 您的密码不应该成为敏感帐户的唯一防线。

我们之前讨论过两种安全功能,一种是双重验证法(2FA),另一个则是通用第二要素(U2F)。通用第二要素为有价值的资产提供相当重要的安全保护。使用 U2F 作为硬体的安全保护也是更安全的作法。

密码是一种安全解决方案,其设计用于大多数人都能完全找到的环境,不同于人们当前使用的环境。

其他常用到身份验证的系统也是如此,例如信用卡、ATM 的 PIN 码,驾照号和社会保险号。这些常用验证码中的任何一个的熵都相当的低。这些系统的安全性不依赖强壮的密码 – 4 位的 PIN 密码可以很容易地被破解 – 与新技术一样,它依赖于仔细而持久的诈欺检测。

虽然您可以提出一组特定的建议,但是密码的未来不仅限于密码,有了其它验证因素,像是 2FA、U2F、单一登入,和生物辨识,但也有更聪明的作法,可以透过提供帐户的厂商,来确保用户数据的安全性和可访问性,并检测出具有诈欺企图的帐户。