ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ente Photos Legacy 账户继承功能详解:如何通过可信联系人移交你的回忆

Ente Photos Legacy 账户继承功能详解:如何通过可信联系人移交你的回忆 Ente Photos Legacy 账户继承功能详解如何通过可信联系人移交你的回忆【免费下载链接】ente End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/enteLegacy 是 Ente Photos端到端加密云相册内置的账户继承机制允许账户所有者指定可信联系人在其缺席如离世、遗忘密码或丢失恢复密钥时安全接管账户并访问加密回忆。本文以 Ente 官方文档为主体结合 移动端实现 与服务端 emergency 控制器 源码完整讲解可信联系人的添加、邀请接受、恢复发起、恢复阻止与联系人移除全流程并深入剖析其底层的通知期7/14/30 天倒计时与 SRP 密码重设原理。Legacy 是什么为缺席而设计的账户继承方案Legacy 的核心能力是允许你信任的联系人在你无法再管理账户时恢复你的 Ente Photos 账户。官方文档明确其最主要的应用场景是在你去世后把回忆传递给你爱的人同时也覆盖其他常见情形——例如当你忘记密码和恢复密钥时可信联系人同样可以帮你找回账户。整个机制的关键设计是一套冷静期cooling-off period流程可信联系人发起恢复请求Initiate Recovery账户所有者收到通知拥有 7、14 或 30 天在添加联系人时配置的时间窗口来**阻止block**这次恢复若在等待期内无人阻止联系人即可重设账户密码从而解密并访问账户中的回忆。这个设计在传递遗产与防止恶意接管之间取得了平衡既保证联系人最终能够接管又给了所有者充足的知情与反悔空间。需要特别强调的是Ente 是端到端加密服务服务端并不持有用户的主密钥。因此 Legacy 恢复的本质不是服务端直接放行而是联系人通过受保护的密钥交接流程合法地完成一次密码与密钥的重置详见后文源码分析。添加可信联系人操作入口使用 Ente Photos 移动端 App按以下路径进入Settings设置 Account账户 Legacy点击Add Trusted Contact添加可信联系人按钮。填写联系人信息进入添加页面后你需要输入要添加的可信联系人的邮箱地址或从 Ente 联系人列表中直接选择。文档特别强调了一个硬性前提可信联系人必须是 Ente 用户。这一点在服务端有严格校验——在 account_owner.go 的AddContact实现中服务端会先通过邮箱执行用户查找LookupUserID若目标邮箱在 Ente 中不存在sql.ErrNoRows会直接返回ErrNotFound并附带错误信息 invited member is not on ente受邀成员不在 Ente 上请求即被拒绝。通知期Recovery Notice的默认值从源码看服务端在添加联系人时会计算恢复通知期noticeInHrs : 24 * 30 // 默认 30 天 if request.RecoveryNoticeInDays ! nil { noticeInHrs *request.RecoveryNoticeInDays * 24 }即客户端若未显式传入天数默认通知期为 30 天24 × 30 小时若传入天数则以天数为准换算成小时存储。7 天、14 天、30 天这些选项即来自该字段服务端最终以小时为单位持久化并在响应中按NoticePeriodInHrs / 24折算回天数返回给客户端展示见 account_owner.go。密钥交接恢复钥匙如何安全到达联系人在添加联系人的请求中客户端会携带一个关键字段EncryptedKey——这是用可信联系人的公钥加密后的账户恢复密钥recovery key密文。服务端只负责存储这段密文见 AddContact 中的request.EncryptedKey落库自身无法解密。恢复发生时联系人通过GetRecoveryInfo接口取回这段密文再用自己的私钥解密final decryptedKey CryptoUtil.openSealSync( CryptoUtil.base642bin(encryptedKey), CryptoUtil.base642bin(_config.getKeyAttributes()!.publicKey), _config.getSecretKey()!, ); final String hexRecoveryKey CryptoUtil.bin2hex(decryptedKey);以上代码来自移动端 emergency_service.dartopenSealSync即 X25519 Secretbox 的非对称封包解密用联系人自己的密钥对解开仅发给他的恢复密钥。这正是整个 Legacy 方案端到端加密属性的根基——服务端与攻击者都无法在中途窃取恢复钥匙。接受可信联系人邀请添加请求发出后必须由对方接受委托关系才正式生效。对方可信联系人需要在 Ente Photos 移动端进入Settings - Account - Legacy在Legacy accountsLegacy 账户分区中点击你的邮箱地址在弹出的确认框中接受邀请。Ente 同时会向可信联系人发送邮件通知提醒其处理这份邀请。从客户端源码看接受/拒绝动作在 emergency_page.dart 的showAcceptOrDeclineDialog中实现点击Accept→ 调用legacy.updateContact(state: LegacyContactState.accepted)将关系状态更新为accepted点击Decline→ 调用legacy.updateContact(state: LegacyContactState.contactDenied)拒绝并移除该请求。对应地服务端关系状态机以LegacyContactState枚举体现至少包含invited待接受、accepted已接受、revoked被所有者撤销、contactDenied被联系人拒绝、contactLeft联系人主动退出等状态——客户端 model.dart 中的isPendingInvite()即通过state LegacyContactState.invited判断请求是否仍处于待处理状态。移动端 Legacy 页面的三种分区从 emergency_page.dart 的实现可以看到Legacy 页面实际由三个逻辑分区构成这有助于你理解整个界面的信息组织分区对应源码字段说明恢复警告区info.recoverSessions有恢复会话在进行时顶部出现警告横幅recoveryWarning所有者可在此点击进入拒绝恢复流程Trusted Contactsinfo.contacts你添加的可信联系人列表可点击进行撤销/移除/修改通知期Legacy Accountsinfo.othersEmergencyContact你作为可信联系人的其他账户列表可点击接受邀请或发起恢复其中Legacy Accounts分区即文档中提到的 Legacy accounts sections是联系人接受邀请与发起恢复的统一入口。作为可信联系人恢复账户发起恢复作为已接受邀请的可信联系人恢复他人账户的入口同样在Settings - Account - Legacy在Legacy Accounts分区中点击该账户的邮箱地址进入账户详情页后点击Start Recovery开始恢复按钮。在客户端发起恢复的确认与执行位于 other_contact_page.dart点击后弹出确认底部弹窗startRecoveryDesc会明确展示目标邮箱确认后调用EmergencyContactService.instance.startRecovery(contact)最终经由 emergency_service.dart 的startRecovery把请求发送到服务端。服务端的恢复会话创建与通知服务端StartRecovery见 recovery_contact.go的执行逻辑非常严谨包含三重校验联系人不能是自己contact and user can not be same只有紧急联系人本人才可发起only the emergency contact can start recovery校验EmergencyContactID actorUserID必须是仍然有效的active联系人关系通过GetActiveEmergencyContact从数据库中取出仍处于有效状态的委托记录。随后服务端将恢复会话插入数据库InsertIntoRecovery并向账户所有者发送恢复已发起的通知邮件sendRecoveryNotification邮件中附带换算后的通知期天数recoveryNoticeInDays : contact.NoticePeriodInHrs / 24。等待期与倒计时恢复发起后账户所有者会获得 7、14 或 30 天以配置为准的时间来阻止这次恢复。这个等待期在客户端以距可恢复时间的倒计时形式呈现other_contact_page.dart 用当前时间加上waitTill服务端返回的剩余微秒数计算出可恢复的精确时刻并格式化显示。服务端对等待期的管理由一个后台定时任务SendRecoveryReminder见 recovery.go驱动其核心逻辑为当WaitTill已过且会话仍处于Waiting状态时自动将状态更新为Ready可恢复并向双方发送通知在等待期内按剩余天数梯度发送提醒邮件剩余9 天时下次提醒安排在 7 天后剩余2~9 天时下次提醒安排在到期前 2 天剩余 2 天时不再追加提醒避免骚扰该定时任务通过 Redis 分布式锁_recoveryReminderLock锁定 1 小时保证多实例下只有一个节点在执行防止重复发信。正是这套状态机 定时任务确保了7/14/30 天倒计时不依赖客户端在线无论所有者是否登录 App到期后都会自动变为可恢复状态。到期后修改密码并接管等待期结束、会话状态变为Ready后联系人回到同一页面App 会提示Recover Account恢复账户按钮见 other_contact_page.dart。点击后流程分两步第一步获取恢复密钥。getRecoveryInfo从服务端取回密文形式的恢复密钥与当前KeyAttributes并用联系人自己的私钥解出明文恢复密钥前文已述。第二步执行密码重设SRP。客户端 emergency_service.dart 的changePasswordForOther走的是标准的 SRPSecure Remote Password协议流程生成新的随机 SRP 用户名UUID v4与 16 字节随机盐使用 RFC 5054 4096 位群参数 SHA-256 生成 SRP 验证子verifier调用initPasswordChange向服务端提交 SRP 握手的第一条消息srpA服务端返回srpB客户端计算会话密钥与证据消息M1调用changePassword提交新密码的 SRP 证据与新密钥属性updatedKeyAttr。服务端对应实现见 recovery.goInitChangePassword与ChangePassword均会先通过checkRecoveryAndGetContact校验当前操作者必须是该恢复会话的紧急联系人且会话允许恢复CanRecover成功修改密码后还会把恢复会话状态更新为Recovered并发出通知。至此联系人可以用新密码登录该账户访问其中所有加密的回忆数据。账户所有者如何阻止恢复当可信联系人发起恢复后账户所有者的 App 会立刻进入戒备状态打开Settings Account Legacy页面顶部会出现恢复已发起的警告横幅客户端对应_WarningBanner见 emergency_page.dart展示recoveryWarning文案并以警示色高亮点击该警告项会弹出确认对话框其中包含目标联系人的邮箱信息确认后调用EmergencyContactService.instance.rejectRecovery(session)emergency_service.dart拒绝本次恢复。服务端RejectRecovery见 recovery_contact.go同样有严格鉴权只有账户所有者本人req.UserID userID才能拒绝且拒绝的会话必须精确匹配该所有者与该联系人getRecoverySessionMatchingRequest。拒绝成功后会话状态置为Rejected并通知联系人恢复流程即终止。客户端还保留了一个调试专用的 Approve recoveryto be removed 按钮仅在kDebugMode下出现用于开发者验证批准路径普通用户不可见。联系人侧可随时取消作为发起方联系人在等待期内也可以自行取消在账户详情页点击Cancel Recovery按钮other_contact_page.dart调用stopRecovery。服务端StopRecovery会校验只有紧急联系人本人可停止并将会话置为Stopped状态、通知所有者。移除可信联系人作为账户所有者你可以随时移除已建立的可信联系人进入Settings Account Legacy点击要移除的可信联系人在弹出的操作菜单中选择Remove移除。从客户端源码看点击联系人后弹出的是showTrustedContactSheet操作面板见 emergency_page.dart它支持两类操作Revoke / Cancel invite撤销邀请若该联系人还处于invited待接受状态可取消邀请state: LegacyContactState.revokedRemove contact移除联系人对已接受的联系人执行移除同样通过legacy.updateContact将状态更新为revoked。需要特别提醒的是修改通知期Update Recovery Notice在存在进行中的恢复会话时会被拒绝——客户端会捕获LegacyError_ActiveRecoverySession异常并弹出 cannot update recovery time 提示emergency_page.dart。服务端 account_owner.go 的UpdateRecoveryNotice逻辑也印证了这一点存在activeSessions时直接返回ErrActiveRecoverySession且合法通知期被限制在1~60 天之间。作为联系人你也可以主动退出委托关系在账户详情页点击 Remove Contact或 Or remove yourself调用legacy.updateContact(state: LegacyContactState.contactLeft)见 other_contact_page.dart将自己从该账户的可信联系人列表中移除。从源码看 Legacy 的完整状态流转综合上述文档与源码Legacy 功能可归纳为两条独立的状态机联系人类LegacyContactStateinvited待接受→accepted已建立→ 终态revoked所有者撤销/contactDenied联系人拒绝/contactLeft联系人退出。恢复会话类RecoveryStatusInitiated已发起→Waiting等待期内所有者可Rejected拒绝、联系人或所有者可Stopped停止→ 到期自动Ready可恢复→ 改密成功后Recovered完成。两个状态机的联动关系清晰体现在数据层恢复会话与联系人关系、所有者、联系人三元组严格绑定每次操作都做操作者身份 会话匹配双重校验getRecoverySessionMatchingRequestrecovery_contact.go。值得一并提及的是当前仓库还在演进一个更新的继承方案——Legacy Kit见 server/ente/legacy_kit.go它基于 Shamir 份额分发的思路引入了noticePeriodInHours、activeRecoverySession、恢复挑战LegacyKitChallengeRequest等更精细的模型。从类型定义LegacyKitVariantTwoOfThree可以推断这是面向2-of-3 多方共同接管的更灵活继承机制可作为理解 Legacy 未来演进的参考。小结Ente Photos 的 Legacy 功能用一套**加密密钥交接 延迟生效 双向通知**的机制在端到端加密的严格约束下实现了安全的账户继承安全前提恢复密钥始终以收件人公钥加密存储服务端不可见所有操作均有身份与会话双重鉴权冷静期设计7/14/30 天可配置等待期配合服务端定时任务自动推进状态既允许所有者阻止又保证委托人最终能够接管完整生命周期从添加联系人、接受邀请到发起恢复、阻止恢复、移除联系人所有环节在移动端与 服务端控制器 中均有对应实现与校验。无论你是想为家人配置一份数字遗产还是想了解端到端加密体系下账户恢复的工程实践Ente Photos 的 Legacy 都是一个值得研究且可直接上手的完整参考实现。【免费下载链接】ente End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表