返回资讯中心
外部精选
软件工程
#开发者实时流

Confidex 如何在不持有密钥的情况下存储和同步加密数据

来源标题:Can anybody proof my cryptography algorithm?

Confidex 通过一个受主密码和独立 secret_key 双重保护的“锁”文件来管理加密密钥,服务器即使拿到该文件也无法读取密钥内容。打开锁必须同时具备主密码和 secret_key,两者均不存储在文件内,因此文件可公开分发而不泄露私钥。

Hacker News 最新ololoid2026/11/13 · 今天30 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

任何人都能验证我的密码学算法吗?

服务器如何在不持有密钥的情况下存储和同步我们的机密数据?我们将追踪 Confidex 如何生成密钥、如何将其保护在锁文件中,以及如何使用这些密钥加密数据并验证变更。

设想我们正在构建一个用于存储机密数据的虚拟保险库。它必须在应用程序关闭后仍将数据保留在笔记本电脑上,并允许我们在另一台设备上打开它。保险库需要自己的密钥。我们必须妥善存储这些密钥,使得即使有人复制了文件,也无法读取或篡改其中的内容。

锁文件保护着密钥:它是一个小型加密文件。打开它需要主密码和一个秘密代码 secret_key;两者都不在文件本身之中。我们可以把整个锁文件印在晨报上。读者会得到一份副本,但公开发布并不会泄露私钥。

假设外人得到了这个文件,甚至知道了主密码。他们现在可以重复所有仅需密码的计算,但这些计算不会产生打开锁所需的密钥:secret_key 也是输入之一。文件中不包含对密码单独进行的校验。打开它仍然需要那个未知的秘密代码。

该代码来自密码学随机数据;不是由人编造的。只要 secret_key 未知,即使正确猜中了主密码也无法打开锁:攻击者仍然缺少一个随机秘密。因此,仅凭弱密码并不会使服务器上的副本变成可实际操作的字典攻击。

如果攻击者同时获得了 secret_key,他们就可以离线测试主密码猜测。这代价高昂,但最终难度取决于密码的强度。

先生们,密钥是做什么的?密钥……解锁东西?

应用程序从操作系统的密码学随机数生成器获取 32 个随机字节,并将其准备用作密钥。这些准备好的字节就是私有主密钥 master_key。

应用程序总是从 master_key 派生出相同的密钥:对相同的字节重复相同的计算会得到相同的结果。因此,笔记本电脑和手机可以恢复出完全相同的密钥。要在新设备上获得 master_key,应用程序必须先使用主密码和 secret_key 打开锁。

为了存储加密数据,应用程序从 master_key 计算出公钥:secret_key。它可以用该公钥为保险库加密数据,而解密则需要 master_key。

“公钥”描述的是该密钥在算法中的角色,而不是必须将其交给所有人的义务。在 Confidex 中,它保留在用户手中。它也是打开锁所需的第二个秘密,因此它留在本地,不通过网络发送。单独来看,secret_key 可以让某人为保险库加密数据,但无法解密数据或代表保险库签署变更。

X25519 是接收 master_key 并计算出 secret_key 的算法。从 secret_key 反推 master_key 实际上是不可行的。对一台假想的超级计算机进行经典攻击,假设每秒执行十亿亿次曲线运算,平均大约需要 2.3 万亿年(SafeCurves 估算)。

public bytes 随机字节32 字节 master_key secret_key public bytes 随机字节32 字节 master_key secret_key 从随机字节到加密密钥。

第二对密钥:签名

唯一原创的是签名

第一对密钥有助于隐藏内容。我们现在需要一种方法来确认保险库的所有者授权了某项变更。服务器也必须能够检查签名,因此我们需要向它发送一个公开验证密钥。第一对密钥的公开部分是 secret_key,服务器绝不能收到它。因此,我们创建第二对永久性的密钥对用于签名。

我们没有存储另一个独立的秘密,而是从 master_key 派生出一个私有签名密钥,称之为 signing_key。应用程序用它来签署数据和锁文件。其他设备及服务器使用其公开部分来检查签名,而无需读取内容。

我们可以从同一个 master_key 恢复出这对密钥。应用程序从中派生出一个起始值:32 个字节,唯一确定签名密钥。

为了给不同的任务派生不同的密钥,我们在计算中加入一个固定标签:这里是 confidex/vault/ed25519/v1。相同的 master_key 和相同的标签总是产生相同的密钥。

主密码没有参与这些计算。两对密钥都依赖于 master_key 的随机字节,而不是某个人编造的字符串。这一区别在后续很重要:密码将保护对已存在密钥的访问,因此我们可以更改密码而不改变密钥本身。

派生使用基于哈希的密钥派生函数:HKDF,即基于 HMAC 的提取与扩展密钥派生函数。Confidex 将其与 SHA-256 配合使用,因此得名 HKDF-SHA256。得到的 32 个字节是 Ed25519 密钥对的种子。signing_key 的公开部分不会泄露 secret_key,因此我们可以将其发送给服务器用于签名验证。

public bytes HKDF-SHA256keymaster_keyinfo"confidex/vault/ed25519/v1" signing_key 签名验证 public bytes HKDF-SHA256keymaster_keyinfo"confidex/vault/ed25519/v1" signing_key 签名验证 一个独立的签名密钥,从同一个主密钥派生。

什么是锁文件,它做什么?

打开舱门,HAL。

对不起,Dave。恐怕我做不到。

锁文件中存储的是加密后的 master_key。打开它需要主密码和 secret_key。公开头部包含格式版本、保险库标识符、signing_key 的公开部分、盐值以及密码处理参数。内部格式版本与 master_key 一起被加密。

创建锁文件时,应用程序已经拥有 master_key,因此它在加密之前计算出 secret_key。打开锁文件时,用户单独提供 secret_key:它不在锁文件的公开副本中。

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →