有一句话,我们在谈 Cashfulness 时经常重复。
“我们看不到你的文件。”
这句话很容易说。很多应用都这么说。
关键在于这句话背后到底是什么。因为“我们不看”和“我们无法看”是两种截然不同的承诺。
第一种是善意的承诺:我们相信你不会去看。
第二种是不可能的承诺:就算想看,你也做不到。
在 Cashfulness,对于你上传的文件,成立的是第二种。让这句话成真的技术名词叫端到端加密。
英文里它被缩写为 E2EE(端到端加密,end-to-end encryption):从一端到另一端的加密。
我知道这听起来像技术黑话。但我保证:读完这篇文章,就算你从没写过一行代码,你也会明白它。你还会明白,对于一个存放你家庭数字的应用来说,这个选择为什么会改变一切。
先把词说清楚
从动词开始。加密一个文件,意思是把它变成一串无法读懂的内容。
不是用一个说“让我进去”的密码把它藏起来,而是真正地转换它:把文字、数字、图片,压缩成一堆对没有正确密钥的人毫无意义的字符块。
能把那堆字符还原成可读形式的东西,叫作密钥。它是一段信息——可以把它想象成一个很长、由计算机生成的密码——没有它,文件就只是噪声。
用密钥加密。用密钥解密。没有密钥,就是一堵墙。
请记住这两个词——加密和密钥——因为接下来的一切都围绕着密钥到底存在哪里。
银行里的保险箱
我用一个我认为能说清一切的例子。
你知道银行的保险箱吗?人们把重要文件、几件首饰、不想放在家里的东西存在那里。
它是这样运作的。
银行给你一个防盗、有人看守的坚固金库。你的保险箱就在里面。
但你保险箱的钥匙在你手里。只有你。
银行守护的是金库,它打不开你的保险箱,它没有钥匙。哪怕明天有个不诚实的员工想偷看,他也做不到:没有你的钥匙,锁就打不开。哪怕小偷闯进来把整个金库都搬走,他们拿到手的也只是一个打不开的金属盒子。
银行为你提供一项服务——金库的安全——却不要求进入你放在里面的东西。
端到端加密,应用到数字文件上,正是同一回事。
Cashfulness 就是那家银行:它为你提供金库,也就是保管你文件的服务器。
而你,是唯一拥有保险箱钥匙的人。
我们,像那家银行一样,只负责看守,却打不开。
上传文件时,实际发生了什么
假设你想在 Cashfulness 里存放银行对账单、一张电费账单、租房合同、一份保单。
这些正是你可以上传到 Cashfulness 的文件:对账单、账单、合同、保单。里面全是你的个人信息——全名、地址、银行账号、金额、往来对象。
流程是这样的。
你从手机或电脑上选择文件。
在它出发之前,还在你的设备上,文件就已经被加密。它变成了我前面说的那堆噪声。
只有之后,已经加密的它,才会传向我们的服务器。
到达服务器的是噪声。留在服务器上的也是噪声。
当你想重新读取它时,文件会以仍然加密的状态回到你的设备,只有在那里——只有在那里,用你的密钥——它才会重新变得可读。
加密发生的那一刻很关键:它发生在你这边,在文件出发之前。而不是“文件到了服务器,我们再替你锁上”。那样的话,就成了银行的抽屉里留着一把你钥匙的复制品。
不。我们从来没有拿到过这把钥匙。它诞生于你,也一直留在你那里。
你的密钥存在哪里
到这里,该问一个恰当的问题了:如果我弄丢了这把宝贵的密钥怎么办?它放在哪里?
你文件的密钥,由你的两样东西共同生成。
第一样,是你登录 Cashfulness 用的密码。
第二样,是激活这项保护时你会收到的一串24 个单词。这是一种在别处也用来保管最敏感密钥的方式——二十四个常见单词,按特定顺序排列,合在一起相当于一把主恢复密钥。
从这两样东西出发,在你的设备上,会生成用来加密和解密你文件的密钥。
而这里正是整篇文章的关键所在:那把密钥永远不会离开你的设备。
它不经过我们的服务器。我们不会把它保存在任何地方。我们也看不到它经过。
就好像那把保险箱的钥匙是在你家里、由你亲手打造的,而且从未离开过那里。银行从未见过它,哪怕一瞬间也没有。
对我们的服务器而言,再说一遍,你的每一份文件永远都是一堆数字噪声。
谁读不到你的文件(也就是:除了你以外的所有人)
我想说得明明白白,因为通常正是在这里,一个隐私承诺才见真章。
构建 Cashfulness 的我们读不到你上传的文件。没有哪个后台面板能让我们的技术人员打开你的保单。从技术上讲这根本不存在,因为我们没有密钥。
管理服务器的人读不到它们。
哪怕攻击者有朝一日入侵我们的系统并卷走一切,他也读不到:拿到手的只是噪声,是无法使用的文件。
即便某个当局正式向我们索要,我们也无法交出可读的内容,因为我们手上没有明文。我们能交出的,只有我们保管的那堆噪声。
“我们看不到你的文件”这句话,到这里,不再是一句客气的安慰。
它成了对一个事实的技术描述。
我们看不到,是因为我们做不到。这是两回事。
硬币的另一面(我想先告诉你)
如此严密的保护是有代价的,隐瞒它是不诚实的。
如果你丢了密码,并且也丢了那 24 个恢复单词,你的文件就会变得无法读取。永远如此。对我们也一样。
没有一个“我全忘了,把文件发回给我”的按钮。也没有哪位技术人员能从后门溜进去替你找回它们。
回到银行的保险箱:如果你丢了钥匙,又没有别人留有备份,箱子里的东西还在,却再也没人能打开了。
我明白这样说可能会让人有点焦虑。但请从另一面看,这正是我们做出这个选择的原因。
如果在某个地方——我们的服务器上,某个抽屉里——存在你密钥的“备份”,那份备份就会成为整个系统最薄弱的一环。它会是攻击者第一个要找的东西。它会是某个当局可能要求我们打开的那扇门。它会是某个不诚实的员工可能复制走的文件。
一把只存在于你设备上的密钥,那扇门,它根本打不开。
我们选择把全部控制权交给你——连同它带来的分量——而不是给自己留一条捷径,那条捷径迟早会变成大坝上的裂口。
我们对你的唯一要求很简单:**把那 24 个单词,当成房产证一样保管好。**写下来,放在安全的地方,不让人看见。不要放进一封写给自己的邮件,也不要存进手机备忘录。那 24 个单词就是你密钥的备用副本。像对待真正重要的东西一样对待它们。
一个诚实的说明:这里的 E2EE 覆盖的是文件
我不想向你多卖弄一分,那样就违背了这整篇文章的初衷。
我给你讲的这种端到端加密,保护的是你上传的文件:对账单、账单、合同、保单。那是最敏感的一层,我们把最严密的锁装在了那里。
而你真正的账务数据——账户、余额、构成你定位也就是你净资产的那些流水——遵循的则是另一套逻辑。
它们存放在我们的数据库里,在欧洲的服务器上,在服务器一侧是明文的。这是一个必要的技术选择:为了让你的账目在手机和电脑之间保持同步,也为了实时计算展示给你的各项指标。如果用和文件一模一样的方式加密它们,应用会变得极其缓慢,实际上也就无法使用了。
但是——这正是很多人没想到的部分——那些数字在传输时不带着你的身份信息。
注册时我们只要求一个昵称(你可以随便起,哪怕是虚构的)、一个邮箱和一个密码。我们不会要求姓名、身份证件号、出生日期、地址、电话。
因此,即便有人拿到了数据库的访问权限,他看到的也只是某个昵称对应着一些账户、余额、流水——却没有办法把这些数字和真实的你联系起来。
关于这第二层保护是如何运作的,以及我们为什么把它建在两层而不是一层之上,有一篇专门的文章:彻底的隐私:两层结构,一个承诺。我在这里就此打住,因为今天的主题是保险箱的钥匙。
我想强调的这一点是:当我们说端到端加密让你的文件无法被读取时,说的是文件。其余部分遵循的是另一种同样严肃的保护。我宁愿由我自己精确地告诉你这一点,也不愿让你误以为存在一种能覆盖一切的魔法加密。
为什么我们如此在意,直到写下这一切
我本可以就此在技术层面收尾。但技术本身,并不是理由所在。
理由是,个人理财是你连和朋友都不太愿意谈起的东西存放的地方。你到底赚多少。你存下了多少,或者存得多么少。压在身上的一笔债。
如果你一打开这样一款应用,心底就残留着某个人在某处可能会窥视的疑虑,那这款应用永远无法给你它存在的理由。
我们把那样东西叫作平静。The calm side of money,金钱平静的一面。而如果你的数字并没有真正被安全保护,平静就只是网站上的一个词。
文件上的端到端加密,不是拿来炫耀的技术奖杯。它是承托其余一切的地板:没有它,那些指标和你的定位,都只是悬空摆放的家具。
正因如此,我们把它写进了地基,而不是像多一个开关那样事后加上去。
用一句话说完
我把它留给你,用我能给出的最短的形式。
你把文件锁进一个保险箱。保险箱的钥匙只有你有,而且它永远不会离开你的设备。我们守着这个锁着的保险箱,却打不开它。
不是因为我们承诺过自己足够正直。
而是因为我们主动放弃了不正直的可能性。
— Vittorio