1 序言 密码的重要性
密码或者密钥,在当今互联网时代的重要性已经不必多说了。在线服务需要密码,离线的数据保护(加密)也需要密码。 虽然有很多正在研究和试验中的新方案,可以绕过密码进行登录,但密码在一些程度上还是不可取代的。这主要是出于如下理由:
- 密码是可以更换的数据。 使用实体财产或者生物特征,比如证件、指纹,甚至虹膜,都存在这些设备不可以(或者至少是难以)替换的问题。 身份证被挂失之后还能继续(被非本人)滥用,是一个例子。 如果一个人的指纹数据因为任何理由泄露,那么此人的指纹就大白于天下,也是一个例子。 因为一个人难以更换这些特征,那么只要出现过大规模的数据泄露,这些特征就无法作为可靠的凭证。
- 密码是可以存在头脑中的保密数据。 用于验证的实体财产,不见得总是在用户自己的手中。即使在,也无法保证用户是出于自愿而运用这些认证。 实体财产验证的是对方“拥有什么”,而密码则是对方“知道什么”。二者还是需要结合起来,才可以增加辨认的可靠性。
- 密码可以具有足够的熵值。 一个足够复杂的密码,经过适当的处理可以作为加密数据的基础。这种复杂程度,如果运用妥当,可以让超级计算机都无法破解。 使用其他,比如生物特征作为加密的基础,那么就要考虑,这些物理特征总是需要经过某种测量才能变成数据——而这种测量如果过于精准,每次生成的数据就会多少有偏差而无法解密数据。 为了兼顾这种容错程度,测量的精度就需要下调。但下调之后的数据,是否还具有足够抵抗超级计算机破解的复杂度(熵值),就还是一个问题。
考虑这些之后,本实验室认为,在未来一段时间里,还是需要一种能妥善保护用于各种在线和离线服务密码的方案。
实际上,因为各种在线服务的安全水平良莠不齐,近年来已经有多次网站数据库泄露事件,其中不乏被明文保存的用户密码。 这应当让大家很容易明白,为什么要尽量避免使用少数几个密码通行整个互联网。 最好的办法是,每个网站都使用单独的、而且相互独立的密码(不同网站的密码互不相似)注册,这样类似的安全问题就能只限于一家网站。
然而人的记忆力有限,不同网站的不同密码,可能有几十甚至上百个,一般人难以记住。 为了解决这个问题,现在市场上有很多免费和收费的密码管理软件或者服务。 这些办法的核心思想都是一样:让用户只需要记住一个主密码,就可以随时查阅用于各个网站的密码。 各个网站的密码在这个软件或者服务中,都被主密码加密保护起来,所以即使是服务提供者也不会知道用户存下的密码是什么。
使用这种方案,保护诸多个人密码的安全问题,就简化成了主密码的安全问题。
2 主密码存在的问题
主密码是密码管理器的唯一访问凭证。任何人访问一个这样的密码数据库,必须、也只能输入主密码才能查看存储的内容。
这带来两个问题:
- 一旦用户遗忘这一密码,数据就全部丢失,没有挽回的余地。
- 主密码是非常重要的信息,具有很高的价值。
- 如果有人,比如一个歹徒,想要获取用户的数据,那么获取主密码就是此人最重要的任务。 只要有了这个密码,那么此人就有可能访问到用户的一切,无论是数据还是在线服务,了解到用户的生活,隐私,甚至还能访问网上银行,操作资产……
- 因此,在最不利的情况下,主密码会给用户带来很大的人身危险:比如为了获取主密码,用户很可能面临歹徒的各种身体折磨。
本实验室认为,为了解决这两个问题,需要研究一种新的方案来保护主密码,而这一方案应当具有如下性质:
- 为了打开密码管理器所需要的密码(或者其他输入),应当有、也只能有一部分不可以被用户记忆。
- 例如 KeePassX 这样的软件,支持在输入密码的同时,让用户选择一个文件输入,二者同时正确才可以解密,就是一个类似的方案。
- 用户依然必须在自己的头脑中记住部分密码。这是为了预防仅仅这个文件落入他人之手就可以解密的情况——用户自己还是必须参与解密的过程。
- 这个文件可以很复杂,甚至可以是随机生成的,因为不存在于用户的头脑中,所以逼迫用户交出密码,就不再有用,必须让用户交出这个不可记忆密码的载体才行。
- 用户应当有销毁这一不可记忆的密码的机会。
- 比如,用户将这一密码写在糯米纸上,那么将纸浸泡在水里,密码消失之后,就没有人(包括用户自己)能再解密这些数据了。
- 用户应当有在可靠的条件下恢复这一不可记忆的密码的机会。
- 不可记忆的密码总是有可能被意外销毁。比如,记载这一密码的糯米纸不小心浸水,或者存储这一密码的磁盘损坏等等。
- 但很显然,恢复这个密码的过程,要足够的安全,满足如下条件:
- 必须是用户自己才能得到这个密码。
- 用户恢复这个密码,必须是自愿的。
- 没有人能强制用户自己启动这个恢复过程。
- 由于不可记忆的密码本身还有可能被用户更改,所以第3条所提到的密码恢复过程,应当能容易适应这种更新。
3 新方案如何实现?
我们注意两个问题:
问题一,需要设计一个载体,用来存放**不可记忆的密码**。这个载体不但能可靠地存放这个密码,还能在用户的指令下随时将它销毁。
问题二,需要设计一套密码恢复方案,在用户自由、自愿、安全的情况下,安全地恢复这一密码。
问题一是一个工程问题,本实验室的解决方案,是使用专门设计的智能卡来存放这一密码。 用户在解锁智能卡时,可以选择输入解锁密码或者自毁密码。一旦输入了后者,卡上数据就会被立刻删除。 但除了用户之外的任何其他人,都无从事先得知用户给出的密码会起到哪种效果。
问题二更加复杂。用户不能单纯利用问题一的解法,比如用另一张智能卡来恢复保存的密码。 因为如果用户处于对自己不利的境界,那么无论是面临哪张智能卡,用户对自己最有利的决定都只能是选择销毁。
寻求他人的帮助
这一密码恢复方案,不能单纯由用户自己完成。用户必须在启动方案之后,寻求他人,比如亲友的帮助。 亲友所能提供的帮助,就是在满足事先约定条件的情况下,给出用户预先托管的数据。而这样的数据组合起来,就可以恢复密码。 这一约定,可以很容易设计成用来检验用户自己是否自愿的。比如,约定必须用户亲自、独自一人拜访才可以给出托管的数据。
为了避免一个足够强大的攻击者借此向用户的亲友施加压力(交出托管的物品),可以让亲友也使用方案一的智能卡保管:只要受到逼迫,这里就不能恢复了。
如果没有很多亲友,可以选择比如靠谱的银行托管服务。 例如在德国,就普遍有银行提供此类服务,客户必须亲自上门,有时还要出示身份证件,才能在工作人员的帮助下打开保险箱,保险箱打开后用户会在独自一人的空间里取用财物。 因此,这种情况下用户虽然还是需要自己解锁在银行保管的智能卡,但这个过程一般是在比较安全的场所完成,用户不会受到直接的逼迫。 如果到这种程度用户还是处于不利的境界,那么输入销毁密码,应该是比较明智的选择了。
虽然亲友或者银行保管的智能卡也有被意外销毁的可能,但这一可能性较低:因为保管中的卡并不会被经常使用。 此外,一些密钥分享(Secret-Sharing)算法,可以做到让多个亲友投票、只要一部分人同意(交出托管数据)而非全部,就可以重建密码。
下面讨论的是,让亲友们保管什么?
比如有3名亲友,直觉上用户可以将不可记忆的密码拆分成三份,交给3个亲友。这样恢复的时候,拜访3个人,就得到了原始的密码。 但这样做的弊端是,如果用户需要更换这一密码,就需要重复上述过程,重新拜访3个人并分发托管的数据。这样很麻烦人,并不方便。
更严重的是,如果3位亲友在用户不知情的情况下相互合作,或在攻击者的胁迫下都选择了妥协,那么用户的这部分密码就还是被恢复出来,“被队友坑”。
因此,为了减少上述麻烦,应当让亲友保管的,不是这一不可记忆的密码,而是一个恢复密钥的私钥,比如GPG私钥: 用户只需要每次更换前述密码时,将这个密码用恢复密钥的公钥加密(然后自行保管密文),那么以后从亲友手中拿回私钥,就可以解密了。 而亲友即使自己相互串通,也只能算出私钥,而不是实际的密码。
不过,虽然用户自己保管了密文,但在最不利的情况下 ——攻击者拿到了用户的一切财物,包括不可记忆的密码经恢复密钥加密的密文,且还可以胁迫亲友参与密码恢复——仍然存在不可记忆的密码被恢复的可能。 这一问题的根源在于,亲友团只要愿意,恢复密钥的过程就不需要用户同意。 因此作为改进,用户自己还要保管一份特殊的密钥恢复数据:这份数据是在恢复过程中必须出现的(而不是密钥分享算法中的那个被服从多数的少数)。
这样,用户自己这份恢复数据,就必须在用户本人的意愿之下才可以放出。 这一步可以使用另一张智能卡了:这张卡很少使用(所以不容易被意外销毁),但是一旦连这张卡也必须销毁,那一定是遇到了异常强大(比如有组织、有人手、有手段)的攻击者。 不过在这一步,做到数据永远消失,可能也不是遗憾了。
绘图说明
上文所述的方案,用图片表示就是下面的样子。
这个方案是不是过于被害妄想,设计过头了?
并不是! 实际上,本实验室也是最近才了解到,ICANN(互联网名称与数字地址分配机构)在保管DNSSEC的根密钥时,就采用了类似的方案!
在ICANN的博文中,我们了解到如下事实:
- 根密钥平时是保存在系统的HSM(硬件安全设备)上的。这是一种专门设计的密码设备,里面加载了根密钥。一旦有人试图从外部破坏、读取这一密钥,就会导致设备立刻动作,销毁存储。
- 如果因为各种原因,比如HSM损坏需要更新,那么ICANN会举行所谓的“密钥仪式”。 在此仪式上,来自各个可信社区的代表,会使用智能卡重建根密钥的恢复密钥(不是根密钥本身)。这些代表们自己本身是无法访问到根密钥的。
HSM的功能类似于可销毁的智能卡,而“密钥仪式”中,让一群代表重建“恢复密钥”而不是最终的根密钥本身,也和本实验室谈到的设计类似。
4 总结
- 本实验室正在开发一种智能卡,既可以存储密码,也可以在用户指令下销毁密码。
- 该种智能卡有两个用途:
- 用于存储和保护用户的一部分主密码,用于密码管理器的日常解密。
- 用于存放密码恢复方案中,恢复密钥的“碎片”,供各位参与者使用。
- 设计了一种借助亲友团帮忙,在用户主导下恢复主密码的方案。