Vessum › 博客 › 诱饵密码,以及为什么大多数都不管用
诱饵密码,以及为什么大多数都不管用
「输入第二个密码看到另一组内容」这个功能已经有十年了。大多数实现过不了唯一重要的那一关。这就是那道测试,以及怎么用它。
「输入第二个密码,看到不同的内容」不是什么新点子。照片保险库类应用做这件事已经超过十年,今天 App Store 上有几十个都提供这个功能。
它们大多在唯一可能派上用场的那一刻失效。值得弄明白为什么,因为失效的原因与加密强度无关,而与某种平常得多的东西有关。
那道测试
设想你把密码交给的那个人以前用过这个应用。他自己手机上就有,或者读到过,或者在别人设备上见过。
他输入你给的密码。应用打开了。
他看得见的东西里,有没有任何一样会告诉他:这是诱饵?
这就是全部的测试。下面写的,都是应用在这道题上失败的各种方式。
失败之一:诱饵是另一个界面
常见的实现是在界面里做一次分支。应用存两个密码,把你输入的内容与两个都比对一下,然后显示相册 A 或相册 B。
这有两个问题。
两个密码都存在设备上。 它们在数据库里、偏好设置文件里,或者钥匙串里。把存储恢复出来,两个都到手了,连同「原本有两个」这个事实。给照片加密没有用,因为应用必须能够校验别人输入的密码,这就意味着它留下了用来比对的东西。
数据库本身在说有两个。 一个叫 is_decoy 的字段、一个值为 2 的 vault_id、一个行数。读取应用存储的检查者不需要破解任何东西。他只是读,然后就知道该继续追问了。
失败之二:一眼就看得出诱饵是诱饵
这一条更微妙,实际后果也更严重。
很多应用把诱饵做成真保险库的简化版。真的那个有创建和管理第二个密码的设置,诱饵没有,因为一个假保险库为什么需要再造假保险库呢?
结果就是:诱饵缺少一个真的才有的功能。任何见过这个应用的人打开它,扫一眼设置,看到本该在那里的一个板块不见了,一秒钟之内就确切地知道自己在看什么。
到这一步,交出密码的那个人比从来没装过这个应用还要糟。他什么也没保护住,而且明显地试图保护过,而这个事实比保险库里的任何东西都有意思得多。
失败之三:应用自己把自己亮了出来
一个带挂锁的图标。名字里带着「Vault」或者「Secret」。一段承诺帮你把东西藏起来、不让别人看见的介绍。
这些都不是密码学上的弱点,只是门口挂了块牌子。如果一个应用可以被指着要,它就不需要被找出来、被攻破。
通过测试需要什么
三个性质,没有一个是稀奇的。
不存任何用来比对的东西
密码不能以任何形式存在任何地方,包括哈希。它应该被输入、用来派生密钥,然后被忘掉。
后果很重,而且没有商量余地:忘记的密码任何人都无法恢复,开发者也不行。 任何向你提供找回选项的应用,都是在告诉你它留下了某样东西,而它留下的东西是可以被拿走的。
磁盘上没有任何东西在数空间
如果存储里有三块加密数据,检查者就知道有三样东西。正确的做法是:无论里面装着一个空间、五个,还是一个都没有,存储看上去都完全一样。
通常的办法是在首次启动时就分配好全部槽位,把它们全部填上随机数据,并把每一个真实槽位填充到完全相同的大小。加密数据和来自好的随机源的数据,服从同一个分布。没有密钥,没有任何东西能把它们分开。
这也是为什么这类应用不能显示一个会变化的「已用空间」数字。任何会动的数字都是会泄密的数字。
每个空间都完全一样
这是大多数实现漏掉的一条,也是上面那道测试真正要考的东西。
诱饵不能是真空间的缩水版。一样的设置、一样顺序的一样板块、一样的措辞、一样能创建属于自己的空间、一样的错误提示。不能有任何标记把某一个标成「原始的」,也不能有任何只属于原始空间的功能。
由此得出的推论是:不存在「最上层」。一个空间应该列出它创建的空间,而绝不列出创建它的那个空间,这样打开某个空间的人就无法判断自己是在第一个,还是在往下三层的地方。
怎样自己检验一个应用
你不需要读任何人的源代码。四个问题就能走完大半路程。
| 问 | 糟糕的回答听起来像 |
|---|---|
| 如果我忘了密码会怎样? | 「联系客服」或者「用你的找回邮箱」 |
| 诱饵和真保险库的设置一样吗? | 「诱饵是一个简化视图」 |
| 我的内容存在哪里? | 「安全备份到云端」 |
| 删除实际上做了什么? | 「永久抹除该文件」 |
最后一条值得多说一句。闪存并不会老老实实地原地覆写,所以「擦掉字节」是做戏。更站得住脚的回答是:删除丢弃的是密钥,这让剩下的字节永久不可读,同时也避免文件数量以一种显示「有东西被拿走了」的方式减少。
Vessum 处在什么位置
Vessum 就是围绕这道测试做出来的,这也是它好几个看上去奇怪的设计决定的原因。
每个空间都有相同的设置,都能创建属于自己的空间,想嵌套多深都行。没有主空间,也没有任何标记把某个空间标为原始的。存储是二十四个固定大小的槽位,首次启动时全部写入随机数据,从那一刻起全部是满的,因此一个装着空间的槽位和一个什么都没装的槽位,是同样多字节的高熵数据。
而且没有密码找回,因为根本没有存下任何可以用来找回它的东西。
有一个限制我们说得很直白:Vessum 被安装这件事没有被隐藏,也不可能被隐藏。 任何看这部手机的人都能看到这个应用,也能看到它存着加密数据。被隐藏的是:有多少个空间,以及里面是什么。
如果你想自己试着分辨一个被占用的槽位和一个空槽位,首页会在你的浏览器里运行真正的密码学运算,请你指出哪些槽位里有东西。没有人能比瞎猜做得更好,而这正是重点所在。