拓冰建站拓冰建站
首页 / 资讯中心 / 正文

2of3 入门实战:用 Shamir 2-of-3 门限把 Ente 恢复密钥拆成三张卡

2of3 入门实战用 Shamir 2-of-3 门限把 Ente 恢复密钥拆成三张卡【免费下载链接】ente End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente导读本文以 Ente 开源仓库中 2of3 入门文档 为主体完整讲解 2of3 的完整生命周期——把一份秘密拆成三张卡、分点存储、在收起来之前测试恢复以及日后随时用任意两张卡恢复秘密。2of3 是 Ente 提供的免费端到端私密网页工具2of3.ente.com无需账号、无需安装秘密始终只停留在你的浏览器里。读完本文你将掌握 2of3 的全部操作步骤、卡片的存储策略、错误信息的含义以及其背后 Shamir 秘密共享的数学原理与开源实现。什么是 2of32of3 把一份重要秘密变成三张恢复卡任意两张卡都能还原出秘密单张卡无法还原。它是一个网页应用不需要账号、不需要安装你的秘密永远不会离开浏览器。适用于 Ente 恢复密钥、密码管理器主密码、钱包助记词、全盘加密密钥、应急break-glass生产凭据等丢不得也泄不得的秘密。这一设计思路与需要两把钥匙的保险箱、能容忍任意一个站点宕机的备份磁带轮换是同源的三份拷贝放在三个地方丢失任一份不再是灾难任意两张的门限意味着攻击者即使拿到一张卡也拿不到任何可用的东西。相关背景与使用场景详见 docs/docs/2of3/index.md。注意如果你的秘密就是 Ente 账户恢复密钥本身可以优先考虑 Legacy Kit。Legacy Kit 与 2of3 使用相同的 2-of-3 Shamir 数学但额外提供了可配置的等待期、卡片丢失时的吊销能力以及绑定 Ente 账号的服务器中介恢复流程。2of3 则适用于非 Ente 秘密或希望恢复过程完全不依赖任何服务器、只依赖卡片本身的情况。将一个秘密拆成三张卡打开 2of3.ente.com。在左侧的Secret字段粘贴或输入你想要拆分的秘密。可以是恢复密钥、主密码、钱包助记词或任何一小段文本。字段下方的计数器会实时显示当前已用字节数与上限。可选地编辑Card label卡片标签。默认显示今天的日期例如26 May 2026。标签会打印在每张卡上方便日后区分不同的卡片组。秘密合法后右侧会立即出现三张卡。每张卡包含一个二维码、卡片编号1、2、3以及一个类似A1B2C3D4的ID。同一份秘密生成的三张卡共享同一个 ID。从源码看秘密合法后立即生成三张卡是由splitSecret在浏览器内同步完成的它调用crypto.getRandomValues生成随机系数、随机 ID并输出三份编码后的 share见 web/apps/twoof3/src/features/twoof3/utils/shamir.ts。[!IMPORTANT]把三张卡当作一个整体套装对待绝不要把不同套装的卡片混用。恢复只有在合并的卡片拥有相同 ID、且由同一份秘密生成时才有效。如果秘密改变了请生成一整套新卡并一起替换掉旧三张。保存卡片每张卡都有独立的操作控件从卡片面板可以Print打印为单张卡打开打印对话框。Download下载把该卡保存为 PNG 图片高分辨率适合日后打印。Share分享在支持的平台上打开系统分享面板移动端及部分桌面浏览器。若不支持分享则改为下载该卡。Copy code复制代码仅复制该卡的文本代码以2of3-开头方便粘贴到笔记或密码管理器中。在源码中卡片渲染为 1400×1840 的高分辨率 Canvas二维码区域 860 像素文本代码按每行最多 80 字符、最多 4 行排版PRINTED_SHARE_CHARS_PER_LINE 80、PRINTED_SHARE_LINE_COUNT 4见 web/apps/twoof3/src/features/twoof3/utils/export.ts 与 renderShareCard。卡面还印有应用名2of3.ente.com、卡片编号、标题与ID指纹即使多年后被人捡到也能看懂。对于想要三张卡外加离线恢复文件的典型情况点击秘密字段下方的Download all cards会下载四个文件三张 PNG 图片每卡一张命名形如today-set-a1b2c3d4-card-1.png。一个 HTML 文件2of3-recovery.html它是 2of3 恢复流程的完全离线副本。详见 How it works。[!NOTE]2of3 的最大秘密长度约为 200 字节文本。精确上限是仍然能印得进一张卡的长度Secret字段下方的字节计数器会显示当前限制。如果秘密太长放不下参见 FAQ。最大长度限制背后的实现格式本身在原理上支持最大 2048 字节MAX_SECRET_BYTES 2048见 shamir.ts但实际可用上限取决于可读二维码 四行印刷文本能否塞进一张卡。源码用maxSecretBytesForEncodedShareLength(MAX_PRINTED_SHARE_LENGTH)计算卡片文本区最多容纳 80×4 320 个字符的编码 share反推得到可容纳的秘密字节数约 200 字节见 export.ts 与 shamir.ts 中的编码长度换算。字节计数器显示的正是这个实时计算的上限。把三张卡存放在不同的地方2of3 的全部意义就在于分离。三份拷贝放在同一个抽屉里那只是一个抽屉。一个合理的分布方案大致是一张卡与重要文件放在一起护照、遗嘱、房产证。一张卡放在物理上独立的地方家里的保险箱、单位的办公桌抽屉或银行保险箱。一张卡交给信任的人配偶、成年子女、遗嘱执行人或多年挚友。卡片不一定要全是纸质或全是数字混合存放完全没问题纸质卡容易离线存放能扛住损坏硬盘的那些意外。下载的 PNG便于小心复制备份中的备份放在保险箱里的 U 盘上也便于通过端到端加密渠道分享。复制的文本代码便于粘贴进密码管理器、密封便签或加密保险库。许多人会希望同一张卡既有一份打印件、又有一份图片分放在两个地方这样一次火灾或一次磁盘故障不会带走整张卡。[!IMPORTANT]不要把两张卡放在同一个地方。两张卡合在一起就是完整秘密。保护来自物理分离而不是来自格式本身。给卡片加上标签让陌生人也能用卡片上已经印有应用名2of3.ente.com、卡片编号和 ID。对于听说过 2of3 的人来说足够了但多年后被不熟悉的人捡到的一张卡可能需要提示。考虑贴一张便签或信封写明这份秘密是用来做什么的让捡到者知道是否要处理它。另外两张卡可能在哪里给捡到者一个着手点。提醒三张中的任意两张就足够了。如果是作为遗产规划的一部分留下卡片请写下每套卡片保护的是哪个秘密、应由谁持有哪张卡。在收起卡片之前测试恢复这是最重要、也最容易被跳过的一步。在存储卡片之前滚动到同一页面的Recover部分用刚制作的三张卡中的任意两张尝试恢复秘密。这一步能发现打印质量差二维码太淡或污损。下载文件被截断。不小心混入的另一套卡片。复制粘贴时在代码末尾丢了一个字符。如果三组可能的配对12、13、23都能恢复出秘密这套卡就是完好的可以收起来了。这也是 FAQ 中最被强调的一条建议见 docs/docs/2of3/faq.md。恢复秘密日后任意时间你可以通过以下任一方式恢复在 2of3.ente.com 的Recover部分或随卡片一起下载的离线恢复 HTML 文件。两条路径的工作方式完全相同且都完全在浏览器中运行。打开 2of3.ente.com或从存储位置打开2of3-recovery.html大多数操作系统上双击即可会用默认浏览器打开。恢复部分有两个槽位Card A和Card B二者可互换。对每个槽位执行以下任一操作Upload image上传图片选择保存的卡片 PNG/JPG或纸质卡的照片。Drag and drop拖放把图片文件直接拖到槽位上。Paste code粘贴代码把以2of3-开头的文本代码粘贴到Code A或Code B字段。槽位一旦收到有效卡片就会显示它是哪张卡例如Card 2 from ID A1B2C3D4。请确认两个槽位显示的是相同的 ID。点击Recover secret。原始秘密会出现在Recovered secret框中。点击Copy复制到剪贴板。恢复校验的每一步ID 一致性、卡片编号不同、校验和比对都可以在combineShares中逐行对应先parseShare解析再依次检查版本、ID 与长度、卡片编号最后用 GF(256) 除法重建秘密字节并比对校验和见 shamir.ts。从手机照片恢复纸质卡的照片可以直接使用因为 2of3 在读取图片时会尝试多种裁剪。如果手机照片把整张卡拍进了画面、二维码对焦清晰通常第一次就能解码。如果不行确保卡片受光均匀二维码上没有强烈的反光。尝试更紧的裁剪尽量只包含二维码。如果用了低质量扫描换一张更高分辨率的照片。背后的机制恢复流程会对每张图片依次尝试整图解码、整图加自动方形裁剪、三种逐级收紧的卡片形裁剪裁剪区域比例分别为[0.086, 0.213, 0.829, 0.591]、[0.135, 0.238, 0.73, 0.49]、[0.16, 0.255, 0.68, 0.52]第一个成功的尝试胜出。这套宽容逻辑同样内嵌在离线恢复文件中。详细原理见 How it works 的 QR decoder 一节实现见 export.ts 中的 decodeQrImage对应源码为 offline-qr-source.ts 生成的内联解码器。从文本代码恢复如果你只有文本代码例如粘贴进了密码管理器把每个代码分别粘贴到Code A或Code B字段即可。代码是以2of3-开头的长字符串。代码内部的空白和换行会被忽略因此在笔记应用里折行显示的代码也没问题。这对应parseShare开头对输入执行的input.replace(/\s/gu, )见 shamir.ts。错误信息含义恢复出错时2of3 会说明发生了什么。常见的有These two cards are from different sets. Match the ID on both cards.这两张卡来自不同套装请匹配两张卡上的 ID。你上传的两张卡由不同秘密生成ID 不同。检查每个槽位下方的ID A1B2C3D4一行两者必须一致。如果不一致找到属于正确套装的那张卡。对应combineShares中的 ID/长度不一致检查shamir.ts。Use two different cards from the same set.请使用同一套装中两张不同的卡。你上传了同一张卡两次或同一张卡的两份拷贝例如纸质卡和它的 PNG。你需要同一套装中两个不同的卡号1 和 2、1 和 3、或 2 和 3。对应 shamir.ts。That code does not look like a 2of3 share.该代码不像 2of3 的 share。粘贴的文本不是 2of3 代码。真正的代码总是以2of3-开头。对应 parseShare 的前缀检查。That share looks incomplete.该 share 看起来不完整。或This share was cut off.该 share 被截断了。代码末尾缺少字符。通常意味着复制粘贴丢了代码尾部或代码换行后漏掉了最后一行。对应 parseShare 的长度校验 与 payload 长度检查。These shares did not reconstruct a valid secret.这些 share 未能重建出有效秘密。两张卡解析正常但没有组合出原始秘密。通常意味着至少一张卡损坏二维码误读、文本代码被改过、或打印质量差。试试另一对卡片一套三张卡共有三种配对。对应 combineShares 的校验和比对失败。Could not read that image.无法读取该图片。或Could not read that QR code.无法读取该二维码。上传的图片不是可识别的二维码。尝试更清晰的照片、更紧的裁剪或上传原始 PNG 而非截图。替换或轮换一套卡片如果需要更改底层秘密例如轮换了密码请把它当作一套全新的 2of3 卡用新秘密生成一整套三张新卡。把新卡分发到原来的三个地方。销毁旧卡碎纸销毁纸质卡、删除 PNG、从笔记中清除文本。不要以防万一保留一张旧卡。一张旧卡和别处的另一张旧卡组合仍然能恢复旧秘密——而这恰恰是你不再希望它可恢复的东西。正如 FAQ 所说2of3 没有就地编辑某一张卡的概念因为数学上三张卡通过同一个逐字节随机系数关联在一起见 docs/docs/2of3/faq.md。卡片上到底是什么理解卡面内容有助于信任这套工具也为日后自建恢复工具提供了依据。文本代码格式每张卡携带一份 share编码为一小段文本代码同一张卡上同时渲染为二维码便于手机拍摄。代码形如2of3-AQEA...2of3-前缀让读者一眼识别代码也让 2of3 能对粘贴的非 share 文本给出明确报错That code does not look like a 2of3 share.。前缀之后是 base64url 编码的字节负载包含 10 字节头部加 share 数据。Share 格式字段从开头读起负载结构为字节字段含义0Version版本当前格式恒为2。恢复同时支持版本 1 创建的卡片。1Card index卡片编号1、2或3即恢复时用于合并 share 的x 值。2-3Length长度秘密字节数的 16 位大端长度。恢复时两份 share 必须一致。4-9Random ID随机 IDcrypto.getRandomValues生成的 6 字节随机值每套卡生成一次。同一秘密的三张卡共享此 ID。10Share data份额数据秘密字节的 share后随 4 字节校验和。校验和与秘密受相同的两张卡门限保护。以上字段与 How it works 的 Share format 一节 完全对应并在源码 shamir.ts 的 splitSecret 头部构建 与 parseShare 的解析 中逐字节落实。卡片 UI 上显示的ID A1B2C3D4是人类可读指纹即 base64url 编码 ID 的前 8 个字符parseShare(value).id.slice(0, 8).toUpperCase()见 index.tsx 中的 shareFingerprint 与 export.ts 中的指纹渲染。格式兼容性早期版本创建的是版本 1 卡片它公开存放校验和允许单张卡对低熵秘密进行猜测确认。版本 2 把校验和保护在两张卡门限之后。恢复同时支持两种版本如果你持有更老的离线恢复页面请生成一套新卡以获得最新版或直接在 2of3.ente.com。离线恢复文件十年后 2of3.ente.com 不在了怎么办点击Download all cards时2of3 会在三张 PNG 之外附带一个额外文件2of3-recovery.html。这是恢复流程的离线副本里面包含与 2of3.ente.com 相同的恢复界面独立 HTML 页面。完整的 Shamir 合并逻辑以内联 JavaScript 写就。一个内嵌的二维码解码器可以本地解码纸质卡的照片。零网络请求不依赖 Ente、2of3.ente.com 或任何 CDN。双击即可打开任何现代浏览器都能运行。用这个文件恢复与在 2of3.ente.com 上恢复完全一致放入两张卡图片或文本、点击Recover secret、复制结果。这个文件回答了十年后 2of3.ente.com 消失了怎么办的问题答案是什么都不会发生。打开随卡片一起存储的 HTML 文件即可恢复。即使 Ente 公司不在了这个文件也不需要从我们这里获取任何东西——它是几百行可审查的 JavaScript行为与 2of3.ente.com 完全一致。从源码看该文件由createOfflineRecoveryHtml生成它把离线二维码解码器源码来自qr-raw/decode.js与qr-raw/index.js经stripSourceMapComment等处理后去依赖化内联进globalThis.__twoOf3DecodeQR并内联了与线上完全相同的 GF(256) 与合并逻辑见 export.ts 中的 createOfflineRecoveryHtml 与 offline-qr-source.ts。[!IMPORTANT]把离线恢复文件当作备份对待。至少在某处存一份耐久的副本U 盘、备份盘或与卡片一起放进保险箱打印出来。卡片是秘密本身恢复文件是打开它们的工具。由于这个文件是自包含的纯 JavaScript你还可以把它当作验证目标通读、静态分析、或与开源仓库中的实现对照来确认它确实做了它声称的事。这里没有需要信任的远程服务。背后的数学Shamir 秘密共享简述2of3 建立在Shamir 秘密共享之上这是 1979 年提出的经典密码学方案。2of3 使用其最简单而有意义的形态把秘密拆成三份 share任意两份即可还原原秘密而单份 share 除字节长度外不泄露任何信息。直觉模型是一条经过两点的直线任取一条穿过 y 轴的直线y 截距就是秘密斜率是随机数、用完即弃。选三个不同的 x 值如 x 1、2、3算出直线上对应的 y 值。每个 (x, y) 对就是一份 share给某人一份share直线上一个点他能画出无穷多条经过该点的直线对 y 截距一无所知。给某人任意两份share两个点有且仅有一条直线经过它们可以算出 y 截距即秘密。如果在普通数域上做这件事会泄露信息例如大秘密的 share 尺寸可预测因此 Shamir 方案在有限域上做算术。2of3 使用GF(256)含 256 个元素的有限域其便利之处在于每个字节都是合法元素从而可以逐字节拆分秘密且每份 share 与秘密等长。对于 2of3 使用的 (k2, n3) 方案逐字节的数学可以完整写出对每个秘密字节s2of3 挑选一个均匀随机的字节r。Share 1 存放sXORr。Share 2 存放sXOR (r × 2 in GF(256))。Share 3 存放sXOR (r × 3 in GF(256))。GF(256) 乘法使用标准的 AES 多项式0x11b。上述三份中的任意两份加上它们的编号x 值1、2、3即可逐字节恢复s从而得到完整秘密。单独一份 share 则是sXOR某个随机字节与随机数不可区分。这些公式可以在源码中逐行对应splitSecret 用gfMul(coefficient, 2)与gfMul(coefficient, 3)生成三份 sharegfMul以GF_POLY 0x11b做多项式约减shamir.tscombineShares 用gfDiv基于费马小定理的gfPow(value, 254)求逆shamir.ts做拉格朗日插值合并。校验和是 32 位 FNV-1a 哈希初始值0x811c9dc5、乘数0x01000193见 checksumBytes拆分前追加到秘密之后合并后再计算比对——校验和同样被门限拆分保护因此单张卡无法用它试探秘密。[!NOTE]2of3 特意只实现 2-of-3 这一种情形以求清晰与简单。同样的方案也支撑着 Ente 账户版的 Legacy Kit它在同样的 2-of-3 数学之上叠加了与 Ente 账号绑定、可撤销的服务器中介恢复流程。如果需要通用的 k-of-n Shamir 共享用于研究项目可以去看 SLIP-0039 等标准2of3 的使命是让 2-of-3 对普通人零摩擦而不是做一个通用密码学库。隐私边界与典型问题秘密会发给 Ente 吗不会。拆分与恢复都在浏览器内完成没有账号、没有登录你的秘密不会离开页面。下载的离线恢复文件也完全离线工作。页面本身作为 ente.com 上的普通页面托管存在常规的服务器请求日志页面加载的 IP但你输入的秘密与生成的卡片完全在设备本地处理见 FAQ 的隐私章节。单张卡能泄露秘密吗不能。单张卡的 share 数据在数学上无害看起来是随机的——因为它确实就是受保护的数据与逐字节均匀随机的字节做 XOR。它只暴露秘密的字节长度不暴露任何内容见 FAQ。和密码管理器有何区别密码管理器用于日常使用的秘密2of3 用于密码管理器自身所依赖的那一两个秘密主密码、恢复密钥、助记词两者互补而非替代。2of3 也不是存放密码的地方——它是一次性的单秘密拆分没有 vault、没有同步、没有多条目概念见 FAQ 与 FAQ。聊天应用破坏了链接或文本会怎样如果通过聊天应用发送文本代码导致换行、混入不可见字符或自动格式化接收方可能拿到损坏的代码。2of3 忽略普通空白与换行折行代码没问题但如果应用把字符变成智能引号或剥离了2of3-前缀代码将无法解析。更稳妥的做法是分享卡片的PNG 图片、原始 PNG 附件或通过不修改消息体的端到端加密渠道发送见 FAQ。深入阅读2of3 总览2of3 是什么、何时使用。How it worksShamir 秘密共享、share 格式、离线恢复文件与 QR 解码器。FAQ关于安全性、存储与边界情况的常见问题。开源实现web/apps/twoof3 下的 Next.js 应用核心逻辑集中在 utils/shamir.tsGF(256) 与拆分/合并、utils/export.ts卡片渲染与离线恢复文件生成、utils/qr-code.ts二维码编码ECC 等级medium、边框 4 模块。按照本文的完整流程操作一遍——拆分、分点存储、测试恢复、离线文件备份——你就拥有了一个不依赖任何在线服务、数学上可验证、十年后依然可用的秘密恢复体系。【免费下载链接】ente End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门