优化图片密码的安全性

根据各位的评论,我们希望在接下来的博文中谈一谈图片密码的安全性。用户体验团队的开发总监 Jeff Johnson 对此功能的算法和安全性颇感兴趣,并创作了这篇有关如何优化图片密码安全性的博文。由于这是一种全新的登录模式,再加上对于安全性(尤其是针对移动设备的安全性)和新身份验证技术的忧虑(例如,面部识别技术的脆弱性,或生物信息识别技术面临的挑战)与日俱增,无怪乎人们会担心该方法中存在潜藏的缺陷。我们的目标是提供一种安全性不在文字密码之下的便捷机制(算法全部由 Jeff 提供)。在下文中,Jeff 将介绍为什么总体来说这是一种强大的解决方案。请注意,人们多年以来积累了众多针对键入式密码的“最佳做法”(例如,数字+字母+大小写混合,设置长度下限,不重复使用密码,不使用有意义的单词等策略。)和重要注意事项(例如,避免使用可能暴露在摄像头下,或可能安装了键盘记录器的公共 Internet 终端),您可以想象一下,在使用图片密码时,这些做法都能找到类似的策略。Jeff 列举了这方面的一些示例,并介绍了该模式的安全逻辑。--Steven


大家曾通过多种方式反复提及了这样一个问题:“我非常看重设备的安全性;哪种登录手势序列能够提供最佳的安全性?”这个问题引发了非常有趣(至少对我这样的数学爱好者来说是这样)的分析。该分析涉及游戏理论,但首先我希望将其精炼为以下最佳做法。

  • 挑选一张至少具有 10 个兴趣点的照片。兴趣点就是可以作为手势地标的区域(您可以触摸的点,可以连线的位置,或可以圈出的区域)。
  • 使用随机的手势类型和顺序组合。虽然线条是排列组合最多的手势,但如果您始终使用 3 根线条,则会为攻击者打开方便之门,因为他们将得以排除包含其他手势类型的序列。
  • 如果您使用一次点击、一根线条和一个圆圈,并随机地排列这些手势,则可预测的顺序组合数量将变为原来的 6 倍。
  • 对于圆圈手势,您可以随机选择顺时针或逆时针绘制。您也可以考虑绘制比“常规”尺寸更大或更小的圆圈。
  • 对于线条手势,您可能会本能地从左向右绘制,但如果您随机地选择连接两点的方向,则将进一步提高安全性。
  • 与所有身份验证模式相同,在输入图片密码时,请避免被其他人看到。
  • 请将您的计算机放置在安全的位置,确保未经授权人的无法接触到它。与输入任何密码时相同,请避免将屏幕暴露在他人的视线和潜在的记录设备之下。
  • 请注意,屏幕上的触摸痕迹有可能暴露您的手势。请定期彻底清洁您的屏幕。虽然如果您在清洁后登录,然后不执行任何操作,可能会增加这种风险,但是反复使用后积累的油迹更容易被攻击者发现(此外,谁会喜欢使用一部油腻腻的设备?)。请注意,油迹的积累更容易在输入数字 PIN 码时缠身,尤其是在设备频繁开关,您一天需要数十次输入该序列的情况下(油迹会在这些位置积累)。在访问登录屏幕时,请时常从倾斜的角度观察屏幕,查看是否存在某种可能暴露您的手势序列的图案。如果是这样,您可以选择清洁屏幕,或在图片密码区域中增加少量额外触摸痕迹(这样可以有效增加将在下文中讨论的兴趣点)

如果您采纳这些建议,则计算机的安全性将显著提高。

如同一些评论中所建议的,我们也曾考虑过缩小图像的尺寸,并在屏幕上的随机位置以稍微旋转的方式显示该图像,以便尽可能降低触摸痕迹带来的风险。同时,我们从可用性反馈中了解到,缩小图片的尺寸不但会增加正确输入手势的难度,而且还会降低登录体验的沉浸感;但是,如果这种方法真的能显著提高安全性,我们也许会在收益和代价之间做出权衡。事实上,我们发现挪动图片虽然能够减少特定位置上的触摸痕迹积累,但是会导致更明显的“触摸痕迹云”,即明显相互关联的一组点击、线条或圆圈。借助这些信息,攻击者可以轻而易举地发现手势之间的关联。然后,攻击者只需轻松地在图片中尝试套用该模式,直到与图片中明显的要素相匹配即可。因此,这种方法不但无法显著提高安全性,同时还会显著降低用户体验的速度和流畅性。事实上,利用触摸痕迹非常困难。当我们拿到人们使用了很久的平板电脑时,上面的触摸痕迹通常已经难以计数,基本上不可能推断出特定的手势组合。即使在已经获知登录序列并知道要在屏幕上留意哪些触摸痕迹的情况下,我们也很少取得成功。向您阐述以下分析结果,是由于我们认为当引入创新的技术时,及时披露潜在的攻击媒介非常重要,这样技术社区就可以针对威胁程度及其潜在隐患达成普遍共识。当然,我们也相信屏幕技术会继续改进,有朝一日,触摸痕迹会彻底从屏幕上消失。

分析

计算各种情境下攻击成功的概率同样非常有趣。我们曾在之前的博文中讨论过,手势的基础是 100 x 100 的网格,即使最简单的手势(点击)也具有 10,000 种可能的值(在近似匹配中,此值会有效地减少为 270)。在实际应用中,兴趣点 (POI) 的数量远远小于该值,一张照片上可供记忆的位置始终是有限的。

尽管还可以通过其他方式来构建分析,为了便于讨论,我们假设图片上只有少量 POI,并且所有手势只涉及这些点。我们假设点击直接发生在 POI 上,圆圈只有两种尺寸(围绕某个点的小圆圈以及大圆圈)和两种方向(顺时针和逆时针),并且线条始终只连接两个兴趣点。由于这些设定并非完全真实,因此实际的排列组合数量还会进一步提高。

Windows 会为图片密码(和 PIN 码)提供额外的保护,即在 5 次错误的尝试后禁用相应的登录机制(此后,您必须使用传统密码)。在这一前提下,我们便可以通过两种方式来判断特定情境下的相对安全性。

首先,我们可以判断当攻击者完全了解您的手势选择方法时,其在触发锁定前成功登录到计算机的概率(下文简称为“Odds1”)。假设可能的手势序列数量为 x,则在锁定前的 5 次尝试中猜出密码的概率为 5 / x。

其次,我们可以假设您有 100 台计算机,每台都根据该情境中设置的规则随机选择了某个密码(下文简称为“Odds100”)。在这种情况下,攻击者成功登录到至少一台计算机的概率是多少?由于这些事件彼此独立,概率计算公式应为:
  1)/x)^100

基本情境

让我们考虑一下安全性最差的情境:您的“图片”为黑色背景正中的单个白点。由于只有一个兴趣点,因此只能使用点击或圆圈手势(没有其他兴趣点可供连线)。很显然,如果我仅使用点击手势,则唯一有效的序列为白点上的 3 次点击,攻击者 100% 会登录成功。再假设仅使用圆圈而不使用点。这样每个手势可以随机选择 4 种可能的圆圈。这种情况下,可能的手势序列达到了 43 = 64 种。此情景下,Odds1 为 7.81% 而 Odds100 为 99.97%。使用该图片密码时,攻击者成功登录到单台计算机的概率竟然不到 8%(我直觉地猜测该数字应该更高),但您可以看到,当规模扩大到 100 台时,攻击者几乎肯定能够成功,至少一台计算机很可能会遭到入侵。虽然某些用户可能会满足这样的概率,但大多数安全意识较强的用户和管理大量计算机的 IT 管理员肯定会发现这一数字无法接受。

我们再来分析每个手势随机选择点击或圆圈的情境。您很可能认为这样会让每个手势的复杂性加倍,但事实上并非如此。在这种情境下,共有 4 种可能的圆圈和 1 种可能的点击,因此,共有 5 种唯一的手势和 125 种序列。

假设我们选择按照以下方式实施“随机”方法:通过掷硬币来确定使用点击还是圆圈。如果是圆圈,我们将随机选择 4 种可能的手势。虽然这种方法看上去实现了完美的随机,但事实上其安全性低于仅使用圆圈的情况。这是因为在一半的概率下,我们都会选择只有一种可能性的手势(点击)。攻击者会将攻击重点放在包含两次或三次点击的手势上,并取得较高的成功率。理想的攻击策略(也有其他概率相同的策略)为先测试 3 次点击,然后在锁定前依次测试 2 次点击后跟 4 种圆圈的情况。虽然表观 Odds1 为 4%(比之前的 7.81% 有所改善),攻击者实际的 Odds1 将达到 25%,超过仅使用圆圈的情况 3 倍。统计数字有时也会骗人!

幸运的是,我们可以轻松地解决此情境所存在的问题。对于每种手势,我们可以在 1 至 5 之间随机选择一个数字。如果为 1,则使用点击。其他情况下,我们将根据该值选择 4 种可能的圆圈之一。这样 Odds1 将降低为 4%(几乎好过第一种情境 2 倍),但 Odds100 仍为糟糕透顶的 98.31%。

略加改进

让我们在之前的方法上略加改进。此情境的图片中仅包含 2 个兴趣点(很难想象实际的照片会如此简单,因此我们可以将其想象为黑色背景上的 2 个白点)。这种情景下,我们可以添加线条手势,但该手势只有两种可能性:从第一个点绘制到第二个点,或从第二个点绘制到第一个点。

从之前的示例中我们已经了解到,不能先随机选择手势类型,然后再选择手势。我们会将所有可能的手势汇总到一起,然后通过随机数字进行映射,为每种可能的手势提供均等的机会。共有 2 种可能的点击,8 种可能的圆圈和 2 种可能的线条。手势序列的总数为 123=1728。这种情况下的 Odds1 为 0.29%,而 Odds100 为 25.2%。通过只有 2 个兴趣点的简单图片,即可将攻击成功的概率降低到如此水平,的确令人印象深刻。即使 100 台计算机同时遭到入侵,攻击者也只有 1/4 的机会成功侵入至少一台计算机。

逐步提高

假设图片中现有 5 个兴趣点。我现在可以想象出符合这一假设的一些非常简单的图片。现在共有 5 种可能的点击,20 种可能的圆圈和 20 种可能的线条。这种情况下,可能的序列数量达到了 453=91,125 种。Odds1 达到了微乎其微的 0.0055%,而 Odds100 也降低到了 0.55%。对于许多用户,这样的概率已经足以保护他们的数据。

推至极致

假设您的安全意识极强,并选择了具有 10 个兴趣点的图片。有人可能会怀疑一张照片中是否能存在如此多的兴趣点。但是,兴趣点不一定要非常“明显”,您只需挑选 10 个自己可以辨认的点,然后针对其随机选择使用的手势。事实上,如果某些点并不明显(但您仍能准确定位它们),还将有助于进一步提高安全性。

现在共有 10 种可能的点击,40 种可能的圆圈和 90 种可能的线条。可能的序列数量达到了惊人的 1403=2,744,000 种。Odds1 达到了微不足道的 0.0002%。事实上,当图片具有 10 个兴趣点时,攻击者与其尝试入侵您的计算机,不如尝试花 1 美元购买“华盛顿州 24 选 4 彩票”去赢取 10,000 美元的大奖,因为前者的成功概率还不到后者的 1/50!Odds100 下降到了 0.018%,甚至 Odds1000 也仅为 0.18%。

社交工程

社交工程对于所有登录机制的安全性都构成了巨大的威胁,无论密码、PIN 码或图片密码都难逃一劫。使用随机方法来构建您的登录序列,对于这些登录机制都大有帮助。

对于技术爱好者,可以通过简单的编程或 Excel 来实施上述方案。但是,最好能为大多数受众提供一种技术门槛较低的方式来帮助他们构建手势序列。当然,如非站点管理员强制规定,我们从未幻想过选择这些工具和流程的用户人数会超过倾向于选择复杂文字密码的用户。

掷骰子

作为一种异想天开的尝试,我希望找到一种方法模拟生成随机手势序列的过程。为此,我选择采用一个 6 面的骰子(骨灰级玩家通常用 D6 来表示这种骰子 :-))来生成 6 兴趣点的手势序列。除了能够完美地映射到骰子的每一面,6 兴趣点图片还具有一个有用的特性,可能的线条数 (30) 恰好等于可能的点击数 (6) 与可能的圆圈数 (24) 之和,因此可以轻松地划分手势类型。

针对三种手势,重复以下步骤:

  1. 掷骰子。
    掷出的数字表示手势要使用 6 个兴趣点中的哪一个(对于线条来说,为起始兴趣点)。
  2. 再次掷骰子。
    • 如果为偶数,则手势为线条
      再次掷骰子。
      如果数字与第一次为选择初始兴趣点而掷出的数字相同,则需要反复掷骰子,直到出现不同的数字。
      此数字为线条的第二个点。
    • 如果骰子掷出奇数,则手势为点击或圆圈
      再次掷骰子。
      使用下列掷出值来确定手势。
      1 - 手势为点击
      2 - 手势为顺时针的小圆圈
      3 - 手势为逆时针的小圆圈
      4 - 手势为顺时针的大圆圈
      5 - 手势为逆时针的大圆圈
      6 - 重新掷骰子

不出所料,6 兴趣点所提供的复杂度在 5 兴趣点和 10 兴趣点之间。Odds1 为 0.0023%,而 Odds100 为 0.23%。

我们在设计图片密码这一新的登录机制时体验到了诸多欢乐,祝福各位在使用该机制登录时也能体验到同等的欢乐!

--Jeff Johnson