news 2026/9/11 0:41:00

Ente Legacy 数字遗产继承与账户恢复指南:可信联系人与 Legacy Kits 双方案深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ente Legacy 数字遗产继承与账户恢复指南:可信联系人与 Legacy Kits 双方案深度解析

Ente Legacy 数字遗产继承与账户恢复指南:可信联系人与 Legacy Kits 双方案深度解析

【免费下载链接】ente💚 End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente

Ente 的 Legacy 功能是面向端到端加密账户设计的数字遗产继承与紧急恢复体系:当账户持有者失联、失能或离世时,被信任的人可以在等待期后重置密码、接管账户。本文将基于 Legacy 功能文档 与 Legacy Kits 文档,结合仓库中 服务端模型、Legacy Kit 控制器、数据库迁移 以及 Shamir 分享实现 等源码,完整讲解"可信联系人(Trusted Contacts)"与"Legacy Kits(遗产工具包)"两条恢复路径的配置步骤、等待期机制、底层密码学设计与安全管理,帮助你在 Ente Locker 中正确部署数字遗产方案。

什么是 Ente Legacy

生命充满不确定性。Legacy 让一个你信任的人,在你失去账户访问权限、丧失行为能力或不幸离世时,能够恢复你的 Ente 账户。这是 Ente 内置的"数字遗产"能力,适用于 Locker(密码保险库)、Photos 等所有基于 Ente 账户体系的产品——恢复的是整个 Ente 账户,而非某个单独的条目或集合。

Ente Locker 提供两种 Legacy 方案:

  • 可信联系人(Trusted contacts):选择另一位 Ente 用户,在等待期结束后由对方恢复你的账户。
  • Legacy Kits(遗产工具包):创建 3 张实体恢复单(recovery sheet),任意 2 张即可在浏览器中发起账户恢复,协助者不需要Ente 账户。

需要强调:两种方案都是账户级别的恢复工具,不是条目共享、集合共享,也不是直接登录。日常向家人开放 Locker 条目或集合访问,应使用共享功能,而不是 Legacy。

方案一:可信联系人(Trusted Contacts)

可信联系人是同意协助你恢复账户的 Ente 用户。如果可信联系人发起恢复,你会收到通知,并可在等待期内阻止该次尝试。

可信联系人恢复的完整流程

  1. 添加一个或多个可信联系人。
  2. 可信联系人在其 Ente 应用中接受邀请。
  3. 需要时,可信联系人发起账户恢复。
  4. 等待期内 Ente 会通知你。
  5. 若你未阻止该次尝试,可信联系人可通过恢复流程重置账户密码。

等待期选项

可信联系人恢复必须经过一段等待期,可在 Legacy 页面配置:

选项说明
7 天恢复更快,但对未授权尝试的保护窗口较短
14 天折中方案
30 天(默认)对未授权恢复尝试提供更强的保护

希望快速恢复可选择较短等待期;默认的 30 天则更适合遗产继承场景,给你充足时间发现并阻止异常恢复。

在移动端添加可信联系人

  1. 打开 Ente Locker。
  2. 打开 Locker 菜单。
  3. 点击Legacy
  4. 点击Add Trusted Contact
  5. 输入对方的邮箱地址。

联系人必须已经拥有 Ente 账户(不需要有效订阅,但必须有账户)。添加后,对方需要在自家 Ente 应用的 Legacy 页面接受邀请——接受邀请意味着对方确认理解自身责任并同意参与,也可以选择拒绝。

管理可信联系人

Legacy 页面会展示两类信息:

  • Trusted contacts:可以恢复你账户的人。
  • Legacy accounts:你作为可信联系人、被他人指定参与恢复的账户。

移除可信联系人:打开Legacy,点击该联系人,选择Remove。移除后对方立即失去发起恢复的能力;若该联系人已发起恢复,移除操作会同时阻止该次恢复尝试。

服务端的可信联系人实现

可信联系人在服务端由紧急联系人(emergency contact)模型支撑,定义见 server/ente/emergency.go。联系人的状态机包含五个阶段:

  • INVITED(已邀请)、REVOKED(已撤销)、ACCEPTED(已接受)、CONTACT_LEFT(联系人退出)、CONTACT_DENIED(联系人拒绝)。

恢复会话的状态则定义在 同文件:INITIATED(已发起)、WAITING(等待中)、REJECTED(被拒绝)、RECOVERED(已恢复)、STOPPED(已停止)、READY(就绪)。

每个联系人的RecoveryNoticeInDays字段记录了等待天数(即 7/14/30 天选项),恢复会话通过WaitTill字段记录就绪时刻。围绕这些状态,服务端在 server/pkg/controller/emergency/email.go 中定义了完整的邮件通知体系,包括邀请邮件、接受/拒绝邮件、恢复已发起、恢复已就绪、恢复被阻止、恢复完成、恢复提醒等模板。也就是说,每一次状态迁移都会触发对应的邮件通知,这正是"账户所有者被即时通知"机制的服务端实现。

方案二:Legacy Kits(遗产工具包)

Legacy Kits 是面向 Ente 账户的实体恢复工具包,适用于遗产继承、灾难恢复,或你在丢失密码和恢复密钥后的自助恢复场景。每个工具包生成 3 张恢复单,任意 2 张即可发起账户恢复,单张恢复单不足以恢复。

Legacy Kits 的工作原理

创建 Legacy Kit 时,Ente 会生成一个独立的kit secret(工具包密钥),并用 Shamir 2-of-3 秘密分享算法将其拆分为 3 份,每张恢复单携带其中一份:

  • 恢复单不包含你的账户恢复密钥,也无法让持有者直接登录账户。
  • 恢复时,协助者在浏览器中组合任意 2 张恢复单,在本地重建 kit secret,打开一个受限的恢复会话(scoped recovery session),等待所选恢复时间后,通过密码重置流程完成账户恢复。
  • 服务端永远看不到kit secret、恢复单内容或你解密后的恢复密钥。

关于 Shamir 2-of-3 数学原理,2of3 文档 有可视化说明:同一秘密拆分出 3 张卡片,任意 2 张可重建秘密,单张卡片在数学上是无害的——其分享数据看起来完全随机,仅泄露秘密的字节长度,不泄露任何内容。仓库中的实际实现在 web/apps/twoof3/src/features/twoof3/utils/shamir.ts:它基于 GF(256) 有限域(GF_POLY = 0x11b),为秘密的每个字节生成随机系数并构造一次多项式,三个份额分别取 x=1、2、3 时的多项式值(见 splitSecret);恢复时通过拉格朗日插值(combineShares,shamir.ts#L229-L283)重建秘密,并用 4 字节 FNV 校验和验证结果正确性。

与 2of3 的关系:Legacy Kit 是 Ente 为账户场景定制的版本——在相同的 2-of-3 Shamir 数学之上,增加了服务端中介、可撤销的恢复流程(等待期、阻止机制),这正是账户继承所需要的。同一套拆分方案也以独立 Web 应用的形式提供(2of3 介绍),可对任意文本型秘密使用,且不依赖 Ente 账户。

创建 Legacy Kit

Legacy Kit 的创建和管理目前仅在Ente Locker 移动端提供:

  1. 打开 Ente Locker。
  2. 打开 Locker 菜单。
  3. 点击Legacy
  4. 打开Legacy kits
  5. 点击Create legacy kit
  6. 为 3 张恢复单命名。
  7. 选择恢复等待时间。
  8. 按提示完成身份认证。
  9. 下载、打印或分享恢复单。

存储建议:将 3 张恢复单分开存放,例如一张留在家中、一张交给信任的家人、一张放在律师处或其他安全场所。注意,打印出的恢复单会显示人类可读的恢复单名称,避免使用敏感名称

创建时,移动端会通过 mobile/apps/locker/lib/services/legacy_kit.dart 中的createKit调用 Rust 侧实现,携带当前账户的KeyAttributes(用于加密恢复密钥)、恢复单名称列表和noticePeriodInHours,最终与服务端CreateLegacyKitRequest交互。

恢复等待时间

每个 Kit 只能选择一个等待时间:

选项服务端对应的noticePeriodInHours
Immediate(立即)0
1 天24
7 天(默认)168
15 天360
30 天720

服务端在 server/pkg/controller/legacy_kit/controller.go#L24-L30 中通过validNoticePeriods白名单严格校验上述 5 个取值,其他值一律返回invalid legacy kit notice period错误。

选定的等待时间在恢复发起时被固化(数据库中的effective_notice_period_in_hrs字段,见 迁移脚本)。之后修改等待时间只影响未来的恢复尝试,且恢复尝试进行中无法修改——仓库代码在UpdateRecoveryNotice中会先检查是否存在活动会话,存在则直接拒绝。

Immediate(立即恢复)适合自助恢复,但几乎不给你发现和阻止未授权尝试的时间;遗产继承场景建议使用更长的等待期。

使用 Legacy Kit 恢复账户

协助者不需要安装 Ente,也不需要 Ente 账户。恢复流程在浏览器中完成:

  1. 打开恢复单上印制的恢复 URL(Ente Cloud 恢复单使用legacy.ente.com)。
  2. 从同一工具包中录入任意 2 张恢复单。
  3. 跟随浏览器中的恢复流程。
  4. 等待恢复尝试就绪。
  5. 为账户设置新密码。

自托管或自定义部署的恢复 URL 可能不同,务必使用恢复单上印制的 URL。服务端通过配置项apps.legacy读取部署方自定义的 Legacy 应用地址,缺省时为https://legacy.ente.com(见 controller.go#L318-L324)。

服务端的恢复会话机制

浏览器端重建 kit secret 后,会向服务端发起OpenRecovery。整个流程的服务端实现值得细读:

  1. 挑战(Challenge):服务端生成 32 字节随机挑战,用 kit secret 确定性派生的 X25519 公钥(AuthPublicKey)加密后返回,有效期 1 小时;数据库中只保存挑战的 SHA-256 哈希(见 controller.go#L168-L193 与 repository.go 的CreateChallenge/consumeChallengeTx)。
  2. 打开会话:客户端解密挑战并回传(证明自己确实持有 kit secret),服务端校验并创建恢复会话。每个 Kit 同时只允许一个活动恢复会话——迁移脚本中的唯一索引idx_legacy_kit_recovery_active_per_kit在数据库层面强制了这一约束(121_create_legacy_kits.up.sql#L62-L64)。
  3. 会话令牌:服务端发放 32 字节随机会话令牌,数据库中仅保存其 SHA-256 哈希(legacy_kit_recovery_session_token表)。
  4. 等待与就绪:会话初始状态为WAITINGwait_till记录就绪时刻;等待期过后状态转为READYensureSessionReadyForUseTx负责惰性转换)。等待期为 0(Immediate)时会话直接进入READY
  5. 密码重置:只有READY状态的会话才能调用GetRecoveryInfo获取加密的恢复密钥 Blob 与账户KeyAttributes,随后通过 SRP 流程设置新密码并更新密钥属性;成功后会话状态置为RECOVERED,并触发恢复完成通知(controller.go#L278-L299)。

会话状态机完整定义为WAITING / READY / BLOCKED / CANCELLED / RECOVERED(server/ente/legacy_kit.go#L8-L14)。toRecoverySession会把"已过等待期的 WAITING"动态转换为READY,这一点有单元测试覆盖(controller_test.go 中的TestToRecoverySessionMarksExpiredWaitingSessionReady)。

管理 Legacy Kit

在移动端进入Legacy → Legacy kits并点击某个 Kit,即可:

  • 重新下载恢复单;
  • 没有活动恢复时修改恢复等待时间;
  • 删除该 Kit;
  • 阻止当前活动的恢复尝试。

每个账户最多可创建5 个未删除的 Legacy Kit,删除的 Kit 不计入该限额。服务端在CreateKitWithLimit中通过事务加行锁(SELECT ... FOR UPDATE)保证并发下限额的准确性(repository.go#L52-L81)。

阻止与删除的语义差异

当有人用 Legacy Kit 发起恢复时,Ente 会发送"恢复已开始"邮件,Legacy 页面也会显示活动恢复警告。两类操作的语义不同,需要区分:

  • Block recovery(阻止恢复):取消当前活动的恢复尝试(状态置为BLOCKED)。Kit 本身仍然可用——持有 2 张恢复单的人之后仍可发起新的恢复尝试。
  • Delete kit(删除工具包):使这些恢复单永久失效is_deleted = TRUE),并同时阻止该 Kit 任何待处理的活动恢复尝试。删除后这些恢复单无法再发起恢复。

邮件通知方面:Ente 会在 Legacy Kit 恢复开始完成时各发送一封邮件;目前不会在延迟恢复变为就绪时单独发送邮件。移动端实现中 Kit 相关的服务端接口(blockKitRecoverydeleteKitupdateKitRecoveryNotice等)都在 legacy_kit.dart 中统一封装。

阻止恢复(Blocking Recovery)

如果有人未经许可发起恢复,你可以阻止:

  1. 打开 Ente Locker。
  2. 打开 Locker 菜单。
  3. 点击Legacy
  4. 打开恢复警告。
  5. 阻止该恢复尝试。

阻止可信联系人恢复会停止该次尝试。对于 Legacy Kit,阻止会取消当前活动尝试,但 Kit 仍可被用于发起下一次尝试,除非你删除该 Kit。每次恢复发起的审计信息(使用的恢复单编号、IP 地址、User-Agent)会被记录在会话的initiatorsJSONB 字段中,但这些只是审计线索(audit hints),不能证明操作者的身份——服务端代码注释也明确写道"这是审计提示,不是授权原语"(server/ente/legacy_kit.go#L89-L96)。

重要注意事项

  • Legacy 作用于整个 Ente 账户:恢复完成后,访问的是被恢复的 Ente 账户(跨所有 Ente 应用,不限于 Locker 条目或某个集合)。
  • 可信联系人必须是 Ente 用户;Legacy Kits 的协助者则不需要 Ente 账户。
  • 恢复可以被阻止:恢复开始时你会收到通知,并可在等待期内阻止未授权尝试。
  • 这不是共享:日常向家人开放 Locker 条目或集合,请使用共享功能。
  • 恢复会重置密码与密钥:通过恢复流程重置密码后,账户的 2FA 与 passkey 等第二因素会被移除,以便用新密码访问账户(见 Legacy FAQ)。
  • Legacy Kits 不创建可信联系人关系,也不会暂停不活跃账户删除(inactive-account deletion)。
  • 恢复密钥变化的影响:如果你的账户恢复密钥发生改变,现有 Kit 可能失效,除非在未来版本中重新创建或重新包装。
  • 当前限制:Legacy Kits 目前没有 Kit 昵称和"Verify kit"验证流程,Kit 标签基于 3 张恢复单的名称。

典型使用场景

  • 数字遗产继承(Digital inheritance):家人在你去世后恢复你的账户。
  • 紧急账户恢复(Emergency account recovery):丢失密码和恢复密钥后重新获得访问权。
  • 失能预案(Incapacity planning):确保你无法响应时重要信息仍可恢复。
  • 业务连续性(Business continuity):关键账户始终可被恢复,保证组织运转不中断。

安全设计小结

从 服务端模型 与 数据库迁移 可以确认 Legacy 的安全设计要点:

  • 账户恢复密钥以Base64(secretbox nonce || MAC || ciphertext)形式加密存储(encrypted_recovery_blob),服务端无法解密;
  • 恢复单名称与已保存的分享载荷以EncryptedOwnerBlob加密存储,服务端无法读取;
  • 认证公钥由 kit secret 确定性派生(X25519),形成"持有 2 份份额才能解密挑战"的证明机制;
  • 挑战与会话令牌在服务端均只存哈希,即使数据库泄露也无法直接重用;
  • 恢复完成前必须经历等待期,期间账户所有者可随时阻止;
  • 密钥恢复是延迟的、所有者可通知的(delayed, owner-notified recovery),这是整个 Legacy 体系的核心设计哲学。

延伸阅读

  • Legacy Kits 详细文档
  • Legacy 常见问题(FAQ)
  • 2of3 独立分享应用介绍
  • 2of3 工作原理(Shamir 数学与分享格式)
  • Ente 加密机制说明
  • 服务端实现:Legacy Kit 控制器、Legacy Kit 仓储层、紧急联系人模型、数据库迁移
  • 客户端实现:移动端 legacy_kit.dart、Shamir 分享算法

【免费下载链接】ente💚 End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 0:38:30

Task Master 命令参考指南:AI 驱动的任务管理 CLI 全命令详解

Task Master 命令参考指南:AI 驱动的任务管理 CLI 全命令详解 【免费下载链接】claude-task-master An AI-powered task-management system you can drop into Cursor, Lovable, Windsurf, Roo, and others. 项目地址: https://gitcode.com/GitHub_Trending/cl/cl…

作者头像 李华
网站建设 2026/9/11 0:38:21

LeetCode-Go 题解 507. Perfect Number:完美数的 Go 实现与数论分析

LeetCode-Go 题解 507. Perfect Number:完美数的 Go 实现与数论分析 【免费下载链接】LeetCode-Go ✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解 项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go …

作者头像 李华
网站建设 2026/9/11 0:21:43

OpenUI5空白符处理机制与Web开发实践

1. OpenUI5中的空白符处理机制解析在Web开发领域,空白符处理一直是个容易被忽视却至关重要的问题。OpenUI5作为企业级前端框架,其whitespaceReplacer.js模块正是为解决HTML模板渲染中的空白符问题而设计的核心组件。这个不到200行的工具类,实…

作者头像 李华