Mozilla Firefox 密码是如何加密的?

信息安全 加密 密码学 火狐
2021-09-02 12:50:14

据我所知,当前版本的Mozilla Firefox将保存的密码(用3DES加密logins.json存储文件中,同时密钥存储在key4.db(或key3.db旧版本中)。

如果没有为密码设置主密钥,则可以访问密钥数据库文件。在数据库中,我遇到了一个确实看起来像键的条目。

------------------------------
|    id    | item1 | item2   |
------------------------------
| password |  ...  |  ...    |
------------------------------

那么,为什么数据库中可能有两个3DES密钥?它们真的是加密密钥吗?如何使用它们来解密logins.json数据?正在使用哪个键控选项?

2个回答

@jnylen的评论给出了算法的来源

在数据结构中,item1是全局盐,并且item2包含(在 DER 编码中)入口盐和加密密钥。此密钥用于加密其余数据(每个用户名和密码)。

主密钥的加密是使用 3DES-CBC 完成的,密钥(和 IV)源自主密码、全局盐和“每个条目”盐。默认情况下,主密码是空字符串。sha1 将密码的熵限制为 160 位,而 3DES 将其进一步限制为 112 位。密码不会使用哈希的多次迭代来强化。

项目(用户名和密码)的加密是使用 3DES-CBC 完成的,每个项目的元数据中都包含一个 IV。无法从算法的这个来源猜测IV是如何生成的。

除非 IV 生成不佳,否则加密的少量数据意味着对 3DES 的最佳攻击是暴力破解主密钥或用户密码。112 位的上限意味着按照今天的标准,这个算法被认为是弱的:一个拥有大量资源的大组织可能能够在几十年内暴力破解密钥。量子计算机可能会更快地破坏它们。

实际上,这意味着必须使用一个好的长密码作为主密码。该算法需要进行良好的重构,转向当前的最佳实践:Argon2id 至少 128MB 和 3 次迭代,以及 AEAD 密码(如 TLS 1.3 中使用的密码)。

在此处输入图像描述

我已经创建了 Firefox 算法的可视化解释,不是很漂亮,但我希望它有所帮助。