好久不写博文了,过去一年发生了很多变化,实验室负责人也很忙,然后又因为家里网络不好,几乎没怎么打开电脑。
但是还是有一点点成就的,这就是打算在这里介绍的工具:NeoAtlantis Slate!
它是一个火狐插件,可以从 https://addons.mozilla.org/de/firefox/addon/neoatlantis-slate/ 这里下载。
这个工具的作用很但一,基本上就是实现了上一篇博文的新的口令管理体系。简单来说,就是用一个「口令请求网址」代替实际保存的密码。 这样在密码管理器里面,我们就不再保存实际使用的密码,而是一个要导入到这个工具中的URL。而当我们需要获得口令的时候,我们需要进行如下操作:
- 如果 NeoAtlantis Slate(下面简称Slate) 没有初始化,需要加载密码种子。这个种子其实就是一个加密保存的随机密码本,我们的一切操作都基于密码本提供的信息熵来完成。
- 如果 Slate 已经启动,它会提供一个界面,允许把「口令请求网址」粘贴进来。
- 「口令请求网址」包含建议的口令生成格式(长度、大小写、特殊文本等)。如果没有指定,会默认为大小写+数字混合。点击生成,即可根据网址获得对应的密码。
- 在网页上需要输入密码的地方,点击右键菜单,可以将内存中生成的密码粘贴到对应的密码框中。
这样做有什么优势?
首先,这个插件避免了需要在多个地方重复输入密码的做法。
通过在插件中设置Content-Security-Policy,可以让插件本身变得安全,不会泄露任何信息。最关键的解密密码,只在初始化插件的时候需要输入一次。
只要火狐浏览器本身不存在太多可以让网页脚本获得内存中其他部分信息的严重bug,系统也没有高权限的恶意软件读取内存,我们可以大致相信这个插件的内部状态是无法被外界获取、以及重现的。 这样,任何需要这个插件参与的生成密码的过程,就是一个必须存在「初始化种子」的过程,而这个初始化种子可以做到完全不在互联网上留存痕迹(比如存在U盘上)。
这个插件扮演了一个类似软件实现的安全模块的作用。即使「口令请求网址」完全泄露,只要缺少这个插件,网址本身就完全没有意义。 将「口令请求网址」和插件配合使用,本身就是一种获取密码的双重验证做法。
其次,我们在口令请求网址中记录它所能使用的域名,并将域名信息和口令结果绑定。
这样做的意义是防止钓鱼攻击。软件会检查输入的网址所包含的域名,与实际网页上的是否一致,并拒绝不一致的情况。 这样,使用「看起来像」的网址进行欺骗是不容易的。
接下来可以做什么?
开发这个插件的时候,我把工作分成了2部分:核心逻辑,和插件本身。
插件有一个核心的库叫做password-security-module, 它是一个软件实现的类似 TPM 2.0 这样的芯片的东西,但只是在设计上相似,并不具有兼容的接口。
我们注意到 TPM 2.0 里面有很多设计是无状态的。 比如:这个芯片本身并不存储很多信息,但用户却可以「导入」或者「生成」无限多的密钥。这是怎么做到的呢?
TPM 2.0 自己具有一些随机的根密钥,它们是无法导出的。 在 TPM 中生成一个密钥,比如非对称加密中的私钥时,它并不保存密钥数据,而是将私钥用基于根密钥得出的保护密钥进行加密,并委托用户进行保管。 这样,即使私钥存在于芯片之外,也无人可以破解它。而用户需要使用这个私钥的时候,仍然需要将之前得到的参数一并提供。芯片会首先解密获得这个私钥,再进行用户请求的操作。
受这一思想启发,我设计了上面这个插件和它的核心模块。为了避免重新造密码学的轮子,PSM 模块本身并不搞很多密码学的设计,而是基于一个假设,即用户会提供它一个随机预言函数。 至于这个随机预言函数是怎么实现的,比如用 SHA-512 或者 HMAC,模块本身并不关心。这样安全性的问题就转移给了这个函数的设计者,而非模块的作者(我)了。
PSM 虽然只使用一个随机函数,但是可以做的事情有很多。比如本项目中使用 PSM 的对称签名功能来实现唯一、可重复地从「口令请求网址」得到能生成口令的基本信息,就是一个例子。 考虑到比如实际上 curve25519 和 ed25519 的私钥也可以从随机比特初始化,那么 PSM 也可以增加生成非对称的签名/加密密钥对的功能。进而用于比如在线聊天中的身份识别和端到端加密等应用。
PSM 当然也可以用于对称加密存储信息。把明文丢进去,获得密文。或者反过来。总而言之可以看出即使是一个无状态(不随着使用存储更多额外信息)的程序,也可以有很大的作用。
而既然这个设计是无状态的,那就可以把这个插件固化到只读设备上,比如装了类似 tails 操作系统那样的只读U盘……