Vessum › 博客 › 诱饵密码,以及为什么大多数都不管用

诱饵密码,以及为什么大多数都不管用

「输入第二个密码看到另一组内容」这个功能已经有十年了。大多数实现过不了唯一重要的那一关。这就是那道测试,以及怎么用它。

「输入第二个密码,看到不同的内容」不是什么新点子。照片保险库类应用做这件事已经超过十年,今天 App Store 上有几十个都提供这个功能。

它们大多在唯一可能派上用场的那一刻失效。值得弄明白为什么,因为失效的原因与加密强度无关,而与某种平常得多的东西有关。

那道测试

设想你把密码交给的那个人以前用过这个应用。他自己手机上就有,或者读到过,或者在别人设备上见过。

他输入你给的密码。应用打开了。

他看得见的东西里,有没有任何一样会告诉他:这是诱饵?

这就是全部的测试。下面写的,都是应用在这道题上失败的各种方式。

失败之一:诱饵是另一个界面

常见的实现是在界面里做一次分支。应用存两个密码,把你输入的内容与两个都比对一下,然后显示相册 A 或相册 B。

这有两个问题。

两个密码都存在设备上。 它们在数据库里、偏好设置文件里,或者钥匙串里。把存储恢复出来,两个都到手了,连同「原本有两个」这个事实。给照片加密没有用,因为应用必须能够校验别人输入的密码,这就意味着它留下了用来比对的东西。

数据库本身在说有两个。 一个叫 is_decoy 的字段、一个值为 2 的 vault_id、一个行数。读取应用存储的检查者不需要破解任何东西。他只是读,然后就知道该继续追问了。

失败之二:一眼就看得出诱饵是诱饵

这一条更微妙,实际后果也更严重。

很多应用把诱饵做成真保险库的简化版。真的那个有创建和管理第二个密码的设置,诱饵没有,因为一个假保险库为什么需要再造假保险库呢?

结果就是:诱饵缺少一个真的才有的功能。任何见过这个应用的人打开它,扫一眼设置,看到本该在那里的一个板块不见了,一秒钟之内就确切地知道自己在看什么。

到这一步,交出密码的那个人比从来没装过这个应用还要糟。他什么也没保护住,而且明显地试图保护过,而这个事实比保险库里的任何东西都有意思得多。

失败之三:应用自己把自己亮了出来

一个带挂锁的图标。名字里带着「Vault」或者「Secret」。一段承诺帮你把东西藏起来、不让别人看见的介绍。

这些都不是密码学上的弱点,只是门口挂了块牌子。如果一个应用可以被指着要,它就不需要被找出来、被攻破。

通过测试需要什么

三个性质,没有一个是稀奇的。

不存任何用来比对的东西

密码不能以任何形式存在任何地方,包括哈希。它应该被输入、用来派生密钥,然后被忘掉。

后果很重,而且没有商量余地:忘记的密码任何人都无法恢复,开发者也不行。 任何向你提供找回选项的应用,都是在告诉你它留下了某样东西,而它留下的东西是可以被拿走的。

磁盘上没有任何东西在数空间

如果存储里有三块加密数据,检查者就知道有三样东西。正确的做法是:无论里面装着一个空间、五个,还是一个都没有,存储看上去都完全一样。

通常的办法是在首次启动时就分配好全部槽位,把它们全部填上随机数据,并把每一个真实槽位填充到完全相同的大小。加密数据和来自好的随机源的数据,服从同一个分布。没有密钥,没有任何东西能把它们分开。

这也是为什么这类应用不能显示一个会变化的「已用空间」数字。任何会动的数字都是会泄密的数字。

每个空间都完全一样

这是大多数实现漏掉的一条,也是上面那道测试真正要考的东西。

诱饵不能是真空间的缩水版。一样的设置、一样顺序的一样板块、一样的措辞、一样能创建属于自己的空间、一样的错误提示。不能有任何标记把某一个标成「原始的」,也不能有任何只属于原始空间的功能。

由此得出的推论是:不存在「最上层」。一个空间应该列出它创建的空间,而绝不列出创建它的那个空间,这样打开某个空间的人就无法判断自己是在第一个,还是在往下三层的地方。

怎样自己检验一个应用

你不需要读任何人的源代码。四个问题就能走完大半路程。

问糟糕的回答听起来像
如果我忘了密码会怎样?「联系客服」或者「用你的找回邮箱」
诱饵和真保险库的设置一样吗?「诱饵是一个简化视图」
我的内容存在哪里?「安全备份到云端」
删除实际上做了什么?「永久抹除该文件」

最后一条值得多说一句。闪存并不会老老实实地原地覆写,所以「擦掉字节」是做戏。更站得住脚的回答是:删除丢弃的是密钥,这让剩下的字节永久不可读,同时也避免文件数量以一种显示「有东西被拿走了」的方式减少。

Vessum 处在什么位置

Vessum 就是围绕这道测试做出来的,这也是它好几个看上去奇怪的设计决定的原因。

每个空间都有相同的设置,都能创建属于自己的空间,想嵌套多深都行。没有主空间,也没有任何标记把某个空间标为原始的。存储是二十四个固定大小的槽位,首次启动时全部写入随机数据,从那一刻起全部是满的,因此一个装着空间的槽位和一个什么都没装的槽位,是同样多字节的高熵数据。

而且没有密码找回,因为根本没有存下任何可以用来找回它的东西。

有一个限制我们说得很直白:Vessum 被安装这件事没有被隐藏,也不可能被隐藏。 任何看这部手机的人都能看到这个应用,也能看到它存着加密数据。被隐藏的是:有多少个空间,以及里面是什么。

如果你想自己试着分辨一个被占用的槽位和一个空槽位,首页会在你的浏览器里运行真正的密码学运算,请你指出哪些槽位里有东西。没有人能比瞎猜做得更好,而这正是重点所在。

Vessum

照片、文件和笔记,藏在不止一个密码后面。每个密码打开一个不同的空间,而且没有任何一个能证明其他空间存在。

在 App Store 下载