OnePassword 原理

![Alt text](2a547a9f-4e08-4b9c-8ed7-4af67968591f.png)

OnePassword 解决的问题

网站账户太多导致需要记录的账号和密码太多,一般人很难记住很多不同的密码。于是很多人会在不同的网站使用相同的账号密码,但是一旦其中一个网站被拖库,所有网站的密码就都会遭到泄露,这种做法很不安全。OnePassword 就针对这个情况为人们提供了一个安全的生成,存储和登录自动填充密码的解决方案。

那么,OnePassword 是如何解决这个问题的呢?

OnePassword 原理

主要功能

首先我们来看一下 OnePassword 的交互时序,为了方便起见,我画了一幅时序图放在下面

Alt text

可以看到它在注册和登录两个步骤都起到了关键作用,在注册的时候替用户生成了复杂密码,避免了用户自己思考密码的不便和不安全;在登录时又将之前保存的用户名和密码填充到目标网站或者 App 中,解决了用户记不住密码的问题。那么它又是如何保证安全性的呢?

密码安全性

Alt text

为了实现功能在多个终端都可以方便地使用,OnePassword 设计了一个密码仓库的同步机制,会将设备上的密码密文存储到远端的服务器或者网盘中。当新的设备登录时,密码库将被下载到新的设备中以此来实现随时随地在任意设备上均可使用其功能。

用户的密码被传到服务器中,会不会出现密码泄露的问题呢?答案是不会的。 OnePassword 在保存密码时会对密码进行多重的 AES256 加密,而密钥只保存在本地不会传输到远端,也就是说用于加解密的密钥只有你自己掌握,加密和解密的工作都只由本地客户端来完成。所以即使有人攻破了 OnePassword 的服务器取得了所有被加密的密码,在不知道密钥的情况下也无法在合理时间内将密码破解出来。

那么,这个用于登录 OnePassword 账号的密码又会不会被人截获呢?答案也是否定的。为了解释这个问题,首先我们先介绍两个概念,主密码(Master Password)和密钥(Secret Key)

  • 主密码(Master Password)
    用过 OnePassword 的人们都知道,在你注册 OnePassword 时,需要设置一个你自己记得住的密码,这个密码就是主密码。主密码十分重要,当你需要存取其他密码,或者登录其他设备的时候,OnePassword 都会要求你输入主密码(指纹验证其实也依赖了主密码的校验)。主密码只能依赖个人的记忆,不可找回,这意味着一旦你遗失了主密码,那么 OnePassword 中保存的所有密码信息也就随之化为乌有。

  • 密钥(Secret Key)
    在注册阶段用户输入主密码之后,OnePassword 还会生成一个密钥,这个密钥是一个 ‘A3’ 开头的字符串,长下面这个样子
    Alt text

这个密钥被存储于用户的客户端本地,基本无法被破解,这个密钥有时也被称为隐藏密钥,因为他不像是你的主密码,可以容易地被人记住。

上面的连词符号其实并不是个人私钥的一部分,只是为了增强可读性做分割使用的。版本号既不随机也不保密,用户 ID 倒是随机的,可是并不保密,而剩下的部分既是随机的也是保密的。

介绍了以上两个概念,现在回到我们的问题。OnePassword 之所以可以保证用于登录账户的密码不会泄露,是因为它甚至根本没有在服务器中以任何形式存储这个密码。这里 OnePassword 运用了非对称加密中的一项名为 迪菲-赫尔曼密钥交换的技术。具体地说,客户端根据主密码密钥以及其他一些东西(比如加入一些随机数),计算出一个数字,我们称为A,在注册阶段,客户端根据 A 计算出一个 B;然后把 B 发送给服务器。注意,B 类似于 hash(A),具体的方式,可能对 A 做一点其他运算再 hash;不管具体是哪种方案,窃听者都无法通过 B 计算出 A,而且他因为不知道 A,所以也无法做碰撞分析;甚至是,即便窃听者知道了主密码,只要他不知道密钥,他仍无法做碰撞分析。客户端任何时候,都可以根据主密码和密钥计算出 A;同时,server 那边有了一个通过 A 计算出的 B;因为 A 和 B 之间这种特殊的关系,那么此后在登陆阶段:

  1. 客户端可以向服务端证明它有一个和 B 对应的 A
  2. 服务端可以向客户端证明它有一个和 A 对应的 B
  3. 同时让客户端和服务端协定出一个 C 作为后续双方通信信息的加密密钥

这里引用维基百科中的一个一般性描述来说明这个算法
Alt text

具体的数学原理可以参见维基百科的说明,这里不再赘述。总之,通过这个密钥交换协议客户端和 OnePassword 服务端实现了在不传输密码本身的条件下进行通信,以此最大程度上保护密码的安全性。

更换客户端

由于主密码和密钥均由客户自行保管,而密码的加密解密完全依赖于主密码和密钥,所以在新的客户端上使用 OnePassword 的时候,需要用户将自己保存的主密码和密钥两者都输入到新设备的客户端中,这样客户端才能进行登录账户和对密码进行加解密操作。

总结

OnePassword 是一个安全性很高的密码管理工具,它对密码明文的加密和解密工作均在客户端本地完成,且依赖的密钥也都由客户保管,不会在 OnePassword 服务端传输的过程中产生泄露。由此看来,如果不在乎它每年 $279 HKD 的订阅价格,它的确是一个能帮你在摆脱密码焦虑的同时提升你密码安全性的绝佳工具。

参考资料

迪菲-赫尔曼密钥交换
假如你忘了 1Password 的主密码,到底该怎么办?