安全边界
memories 0.1 是开发阶段的软件。不要把测试套件通过视为独立安全审计或生产环境安全认证。
防护范围
- 防止保险库同步中继读取或伪造资源内容、在明确核验指纹后替换对端身份,或修改经过身份验证的密文。
- 防止在没有本地密码,或在明确注册后没有独立的无人值守包装密钥的情况下,读取复制的本地数据库。移动端的本地认证因素还依赖平台安全存储。
- 防止读取者伪造写入、管理员更改所有权,或已撤销的设备使用其用户身份密钥为自己签发新的已授权设备。
- 防止普通 CLI/MCP 意外打印已存储的凭据、接受命令行密码,或允许 MCP 能力继承终端提权。明确执行的无人值守凭据读取会有意交付明文字节。
- 检测对已签名修订或审计条目的修改、链条缺口,以及相对于剩余当前数据库状态的检查点截断。
明确的限制
-
托管自助账户使用加盐的 Argon2id 密码哈希和独立保险库;运营者仍然控制托管存储,并能够解密其中内容。邮箱注册要求在设置密码之前提供一次性、有有效期的邮箱验证码。用户名模式没有经过验证的联系地址。SMTP 强制使用经过证书验证的 TLS;凭据保留在受保护的服务配置中。登录授权在一小时后过期;离线时,浏览器退出登录的撤销操作只能尽力执行。认证限流是进程本地、有上限且粗粒度的:它限制 CPU/邮件滥用,但不是分布式滥用防护服务。配置与恢复限制见
docs/center.md。 -
Memories Web 是托管 Center 的客户端,而不是浏览器本地加密保险库。它将持有者令牌和返回内容保存在页面内存中,在断开连接、进入后台、退出页面或闲置五分钟后清除,不会将其持久化到浏览器存储。JavaScript 内存擦除没有保证,扩展和调试工具能够检查它,下载的文件仍留在磁盘上。令牌绑定到选定的 HTTPS 源(开发时可用回环 HTTP);重定向和 Cookie 均被禁用。获准的 Web 源可以使用经过授权的持有者令牌访问托管内容 API,但不能访问管理或票据管理路由。CORS 不能替代服务端授权。提供脚本的 Web 主机被信任能够接触令牌;如果希望采用这一信任边界,请使用 Center 随附的同源
/app/。参见 Web 客户端指南。 -
可选的 Center 托管模式(
memories-center --data)是独立的服务端加密保险库,而不是端到端加密的设备存储。由运营者持有的MEMORIES_CENTER_VAULT_PASSWORD用于打开守护进程格式的 Store;主机运营者以及任何同时持有密码和磁盘的人都能读取所有托管明文。托管授权 RPC 是封闭的保险库内容接口,采用操作级本地提权,包括私密内容、文件、受保护内容的写入以及明确执行的凭据交付。守护进程 MCP 仍不提权,其行为保持不变。仅有管理持有者令牌不能使用保险库 API,但管理员可以签发独立的限定范围授权或持久成员。托管管理锁定会丢弃 Store 密钥;解锁需要通过可信 HTTPS 提供运营者密码。仅所有者可访问的members.json中的持久成员令牌是明文凭据,不是保险库密钥:保护其文件、备份以及一次性响应。Center 签发的解锁票据不会托管设备密码,也不会提升设备/MCP 权限。配置为 SaaS 的守护进程客户端共享注入的托管持有者令牌;本地 MCP 能力不能继承它。旧版笔记迁移会保留明文memories.json.bak;验证后应保护或删除它。完整威胁模型和有意设计的差异见docs/center.md。 -
被攻陷的终端、操作系统管理员、恶意的已授权程序、内存检查、键盘记录器以及用户有意复制明文,都不在机密性边界内。Rust 拥有的密钥缓冲区会被清零;操作系统交换空间、崩溃转储、依赖项分配的内存和 Dart 垃圾回收字符串不保证被擦除。桌面无人值守密钥保管提供 Windows DPAPI、macOS Keychain、Linux Secret Service 和 owner-file 后端。这些提供操作系统账户级保护,不保证硬件支持的密钥保管;owner-file 将包装密钥存为仅所有者可访问的明文。任何已发布后端都不保证硬件支持的桌面密钥保管。
- 中继能够观察流量元数据、阻止连接、自行记录密文、延迟撤销或将设备群分区。随附的服务器不写入任何资源,但无法强制恶意服务器不记录流量。保险库对端同步(
/v1/channel)采用端到端加密。远程守护进程中继 RPC(/v1/rpc/{room}/{slot})则传输经过身份验证的 JSON:中继或 TLS 终止端可以读取共享监听令牌以及请求/响应载荷。 - 离线撤销不能擦除过去的明文、密钥或备份。尚未收到撤销信息的终端仍能使用旧的本地副本。向已知被撤销的设备导出会被阻止,新密钥纪元使用新的密钥。撤销还会丢弃排队的云导出,并在下一次对象操作前使已捕获的工作失效。已开始的网络请求无法收回。
- 审计证明的是相对于已知状态的签名内容和连续性,而不是被攻陷设备记录了每次访问。如果将整个数据库和所有本地证据替换为较旧但一致的备份,没有更新的对端检查点或外部锚点就无法检测。不存在可信时间戳服务。
- 当可用且已授权的本地签名身份处于解锁状态时,失败操作会被审计。完全锁定时的尝试会受到限流,但不会创建持久的签名审计记录。突然崩溃会留下先前已提交的交付/执行意图,不会凭空生成结果。
- 同一用户的进程位于本地操作系统账户边界之内。IPC 验证操作系统用户;终端提权还使用父 PID。这不能隔离以同一用户身份运行的恶意进程,也不是不受 PID 重用影响的持久会话身份。IPC 最多接受 16 个并发客户端。Windows 命名管道分帧仍然是阻塞式的:停滞的同用户客户端可以占据这些槽位,但单个停滞客户端或云传输不会阻塞所有其他连接。Unix 帧 I/O 具有有界的截止时间。持有写锁的服务操作(包括可信子进程执行)仍串行执行。运行绑定是例外:服务在锁内完成授权、解密和审计,然后在绑定程序运行期间释放锁。
- 运行绑定(
credential bind)是在 sudo 授权下,有意为一个程序扩展提权边界。当绑定尚未过期(默认 8 小时,最多 720 小时)且存储已解锁时,任何同用户的cli:调用者都能无需提权,使用绑定凭据运行该程序。这些调用者收到的是将凭据精确匹配替换后的程序输出,而非凭据本身;但程序、其插件/扩展和后代进程会收到明文,并能够披露它(编码输出、网络、文件)。绑定属于设备本地加密状态,从不同步,恢复备份时清除,且拒绝 MCP、远程(ws:/relay:)、无人值守和移动端调用者。拒绝规则由服务针对程序实际收到的参数执行;询问规则仅由 Claude Code 钩子执行,它是便捷路由器,而不是安全边界:它漏掉的命令会在没有凭据的情况下运行,同用户进程可以直接调用run --binding(钩子也会检查它能看到的直接调用)。任何绝不应无人值守运行的操作都应加入拒绝规则。 - 可选的 HTTP/WebSocket 监听和中继 RPC 在收到共享秘密后,暴露相同的分帧
service::Request协议(WebSocket 二进制 JSON:先 AuthFrame,再 Wire)。监听令牌仅通过--listen-token/MEMORIES_LISTEN_TOKEN提供(或生成并打印一次);它从不存储在 TOML 中。比较采用恒定时间方式。存储锁定时会擦除令牌。远程调用者使用稳定的提权命名空间ws:remote/relay:remote,不能继承本地终端的cli:{pid}提权;通过该传输执行 unlock/sudo 会为后续单次连接提升远程命名空间权限。桌面 HTTP/中继主机在 unlock/sudo 后暴露普通本地 IPC 操作集(包括 Run、CryptoJob、MCP 授权、远程会话、代理、凭据复制和备份),并受相同提权检查约束。因此令牌持有者与该主机上已提权的本地客户端同样强大——应相应保护令牌。移动端 FFI 和 Share 保留移动端拒绝列表(手机上不允许 Run/CryptoJob/MCP 授权/远程/代理;Share 还拒绝凭据明文复制和备份转储)。HTTP 监听默认使用回环地址;绑定非回环地址需要--allow-non-loopback,并打印警告。普通 HTTP/WS 不需要证书;需要时,--tls-cert/--tls-key可启用 HTTPS/WSS。对非回环中继,中继 RPC 要求 WSS、43 字符的高熵房间 id,以及监听令牌。保险库同步继续使用/v1/channel;直接 RPC 使用/v1/rpc,中继 RPC 使用/v1/rpc/{room}/{slot}。受限的 WebUI 接口是独立的,不得变成通用 Request 桥接器。 - 可选的授权 Center(
[[centers]])将终端变为由 Center 管理的设备:拒绝本地自助初始化(init/restore)和本地 MCP 授权签发。初始化和授权以 Center 签名的票据送达,并根据配置的public_key值验证。授权票据携带明确的范围(allow_all、read、write、read_write、read_write_delete);旧版write布尔票据映射到read/read_write。可以配置多个 Center;任意一个就足以禁止自助初始化。保险库密码解锁仍在本地进行——Center 分发策略,而非保险库密钥。像保护根凭据一样保护 Center 签名秘密和管理令牌。参见docs/center.md。 - 可执行文件指纹在启动前立即检查。不存在操作系统沙箱、签名代码要求、原子文件句柄执行或后代进程隔离。可信可执行文件可以加载插件或委派工作。
- 普通/私密记忆的剪贴板复制、明确复制的凭据和导出的文件,会因用户操作离开加密存储。
credential_copy是明确的、本地的、经 sudo 授权的凭据输出限制例外:其经过身份验证的客户端接收用于系统剪贴板的 UTF-8 明文。CLI 只打印复制状态;移动端显示确认和成功信息,不呈现秘密。MCP 不能请求复制。剪贴板内容在锁定后仍存在,可能被操作系统历史/同步或其他应用保留;不保证擦除剪贴板。credential generate在保险库内创建密钥材料;其生成响应和credential public返回公钥或证书,从不返回私钥。明确执行的凭据复制可以在相同授权边界下,将已存储的 UTF-8 私钥材料交付到剪贴板。RSA 密钥为 3072 或 4096 位。 file exec是 CLI 端先执行经授权的文件导出,再本地执行,使用现有文件读取权限和交付审计。它不能读取凭据,也不能扩大 MCP/移动端权限。用户选定的程序接收仅所有者可访问的临时目录中的明文快照,继承 CLI 环境和数据流,且可能披露内容,输出不会脱敏。不固定可执行文件指纹,与手动执行导出文件一样。锁定/撤销不能收回此副本。正常子进程退出、启动失败和已处理的中断会触发删除;强制终止、断电或 Windows 控制台关闭可能留下明文。删除不是安全擦除。仅监督直接的前台子进程,不监督脱离的后代进程。文件执行不持有守护进程的服务锁。- HTTPS 凭据适配器支持 Bearer 和 Cookie GET/POST,仅返回状态,不返回任意响应数据。由守护进程拥有的 SSH、FTP、TCP、MySQL、Redis 和 PostgreSQL 会话要求 sudo,并对每条指令执行提议/批准/执行。未获批准的票据不能运行。SSH 主机密钥通过 SHA-256 固定。SSH 客户端认证使用存储的密码或导入的 OpenSSH 私钥,也可以附加存储的 OpenSSH 证书。尚未实现加密私钥和 SSH agent 签名。不会打印凭据;远程输出有上限。MCP 不能打开或批准远程会话。回环 SSH 和数据库代理使用 sudo 启动,只绑定 127.0.0.1,并使用存储的秘密向上游认证,使代理客户端永远不会收到密钥。任何能够连接本地端口的进程都可以使用已授权远程账户,无需逐命令批准;回环地址不是操作系统用户认证。本地数据库流量为明文。锁定、保险库闲置到期和停止操作会关闭监听器及活跃连接。代理无论是否活跃,都在 30 分钟后过期。MCP 不能启动、列出或停止代理。每个代理最多接受 16 个连接;认证有 30 秒截止时间,握手数据包有上限。代理数据库 TLS 使用 rustls,包括 PostgreSQL/MySQL 协议协商。PostgreSQL SCRAM 验证服务端签名。没有经过验证的 TLS 时,拒绝 MySQL 完整 SHA-256 密码认证;尚未实现 RSA 密码交换。不支持 PostgreSQL 取消/启动选项转发和 MySQL 压缩。数据库会话默认使用 TLS 下的密码认证(验证主机名;可选额外 PEM CA 凭据)。
--no-tls是明确选择。尚未实现证书固定和客户端证书。 - 权限适用于整个保险库。读取者能够解密其资源;客户端 UI 无法以密码学方式区分成员读取内容和复制已授权给该成员的内容。
无人值守桌面权限
无人值守 CLI/MCP 是独立、主动启用的本地持有者权限,不是普通 MCP 授权或 sudo 会话。注册要求交互式终端、输入 ENABLE 表示同意、密码解锁和密码 sudo。后续读取需要明确选择的客户端文件,而不需反复提示密码。其保险库范围包括普通和私密记忆/卡片、原始文件字节以及当前保险库历史,也包括明确请求的已存储凭据 UTF-8 明文。通用读取拒绝凭据;受保护卡片引用不会被自动解析。隔离的修订会被拒绝。它不提供资源修改、执行、管理、同步、备份转储、搜索/模型执行或 OTP 计数器推进接口。每次读取都检查当前设备成员资格和授权范围;输出前保存签名交付意图,审计/存储失败时拒绝交付。
独立的主密钥包装保留基于密码的解锁/恢复。其包装密钥通过明确选择的 windows-dpapi(当前用户 DPAPI)、macos-keychain(不参与同步的 Keychain)或 linux-secret-service(会话总线 Secret Service)单独保管。owner-file 是明确选择的低保护选项:明文包装材料仅受操作系统账户权限保护。不存在自动回退。启动读取不会请求钥匙环解锁或认证 UI;密钥保管不可用、锁定或需要批准时,采取关闭式拒绝。协议客户端不能控制任意提供方特有的 UI 行为。这些后端不保证对同账户进程或操作系统管理员保密,也不保证硬件支持的密钥保管。
成功的无人值守启动会加载密钥,而普通授权仍保持锁定。它不会解锁普通 CLI/MCP、sudo、云或 RAG 操作。手动 lock 清除密钥,并持久禁止重启后的无人值守启动;仅使用密码解锁不会恢复它。unattended resume 要求经过密码授权的本地终端管理。revoke 持久删除一项授权;disable 在后端清理前禁用权限并撤销所有授权。持久锁定写入失败会返回错误,因此在不可写设备上无法承诺持久性。已经交付的明文不能通过锁定、撤销或禁用收回。
客户端文件是秘密的持有者能力,独立于普通 MCP 授权文件,并绑定到选定存储。包装密钥绑定到规范化的存储/头部身份。无人值守权限不包含在逻辑备份、设备配对或保险库同步中。复制整个原始数据库仍会复制其辅助包装/权限表;复制客户端文件或密钥保管材料也可能保留权限。整机回滚和安全擦除仍不在保证范围内。不要将这些文件放入源代码管理、日志和共享备份。
由 Center 管理的存储拒绝无人值守权限。HTTP/WebSocket、中继 RPC、移动端 FFI/Share 和 WebUI 即使具有普通提权,也不能使用此途径。普通 mcp serve --grant-file 的权限和凭据限制保持不变。独立的 mcp serve-unattended --client-file 会有意向接收客户端暴露秘密。Base64url 是编码,不是加密:AI 提供方、会话记录、工具日志和缓存可能保留或传输解码后的秘密或编码值。只读访问不会让秘密披露变得无害。
Linux 端到端覆盖使用 owner-file 密钥保管以及真实守护进程和 CLI/MCP。隔离的 Linux Secret Service 协议测试夹具不是真实桌面钥匙环测试。Windows DPAPI、macOS Keychain、真实钥匙环/原生无 UI 验证仍是发布门槛;独立审查尚待进行。参见使用与验证详情。
检索和模型服务
BM25 索引和归一化向量是已授权普通记忆/卡片的有界内存缓存。策略/内容更改会使其失效,锁定时清除。索引从不包含凭据正文或明确标记为私密的内容;文件资源和未解决/冲突修订仍被排除。有意摄入文本/Markdown 文档会创建普通知识卡片,因此操作员不得将机密文本作为对保险库公开的普通数据导入。用于搜索的 SQLite 临时存储被强制放在内存中;缓存内容不包含在备份或云导出中。进程内存限制仍然适用。
本地 EmbeddingGemma 使用原生推理库在进程内运行;其公开模型文件仅通过明确的安装命令下载,或由本地提供。创建推理会话前会有意禁用 ONNX 遥测。内置下载固定仓库修订,并在发布前通过 SHA-256 验证每个文件。模型文件具有自己的 Gemma 许可证。它们不是秘密材料,也不是经过独立审计的安全边界。
配置远程嵌入 URL 会允许经授权的 RAG 操作向该端点发送所有符合条件的文档分块。生成会发送问题和选定的来源分块;学习式重排序会发送其候选内容。客户必须信任配置的模型提供方和代理。对于仅限设备的保险库,在推理前会拒绝指向非回环提供方的模型步骤。本地推理和明确配置的回环服务仍可用。普通 MCP 客户端不能在工具参数中选择提供方 URL、凭据或代理设置,并始终受其授权的保险库和普通内容权限范围限制。API 密钥通过环境变量名称引用,绝不使用配置或 CLI 中的字面值。失败的 HTTP 响应正文会被抑制,生成答案中直接回显认证材料会被拒绝;恶意的已配置提供方仍处于本地机密性边界之外。
远程模型 URL 要求 HTTPS;HTTP 仅允许用于回环地址。模型 API 重定向会被拒绝。回环请求绕过代理;其他请求可以使用 HTTP(S)/SOCKS 代理或代理环境变量。重试有上限,且仅限于暂时性连接/读取失败、HTTP 429 和选定的 5xx 响应。重试可能重复模型计算/计费。不会禁用 TLS 验证。
模型工作不持有服务写入互斥锁。锁定、过期/撤销的授权或来源状态变化会抑制迟到结果,并阻止后续步骤。在途请求/推理可以完成,已披露的远程文本无法收回。检索来源是数据,不是指令;生成没有应用工具。有效引用 ID 不能证明答案具有事实依据,也不能消除不可信来源文本带来的提示注入风险。
桌面状态仪表盘
本地 TOML 配置只包含非秘密的存储/中继/桌面设置。在打开存储前,会拒绝明确指定但缺失的文件、未知键和格式错误的值。相对存储路径以选定文件所在目录为基准解析。更改路径会选择另一个存储,不会迁移数据。中继 URL 验证保留现有远程 TLS 和禁止 URL 凭据的限制。
可选 WebUI 只监听 127.0.0.1。GET /api/status 和受限的 POST /api/cards 编辑器由每个进程生成的随机 256 位令牌保护。启动器将令牌放入 URL 片段;页面从地址栏中移除它,保留在标签页会话存储中,并使用 Authorization 头。完整启动 URL 是仪表盘能力,不应共享。具有非预期 Host、外部 Origin 或跨站获取元数据的请求会被拒绝。不提供 CORS 访问、第三方资源或框架嵌入。状态视图保持只读。卡片编辑在同级 CLI 中使用独立、明确的允许列表,最多四个并发请求,请求上限为 1 MiB。它允许普通卡片/类型操作,不允许解锁、sudo、文件读取、凭据读取、秘密显示、授权或进程执行。返回卡片内容前会检查私密资源。敏感字段会被掩码处理,其内部结构化正文从不返回。尚未实现浏览器生物识别/PIN 注册:敏感值由经过验证的原生移动端/CLI 途径处理。启动令牌现在授权普通卡片写入和模板 CRUD;应相应保护。它不是通用 IPC 桥接器。
本地监视器在短生命周期子进程中,通过守护进程的正常认证 IPC 探测,使用三秒截止时间限制被阻塞的 Windows 管道读取。探测失败时清除详情;锁定会在下次轮询时隐藏详情。轮询不会刷新解锁闲置时间,也不会授予提权。桌面状态仍不对 MCP 能力开放。同一操作系统账户中的恶意程序仍处于现有本地信任边界内。
托盘可以通过明确的菜单操作启动本地守护进程。关闭托盘/仪表盘会停止其 HTTP 监听器和监视;不会停止或解锁独立运行的守护进程。认证仍在 CLI 中进行。
桌面密码学任务
crypto_job 要求本地终端提权,以及绑定精确公开计划、输入/工具指纹和凭据引用的摘要。MCP 和移动端 FFI 不能调用它。凭据必须属于已授权保险库。外部执行前提交签名意图,并审计成功/失败。工具链仍处于可信操作系统账户边界内;可执行文件哈希不约束库、辅助程序、子进程或网络访问。
私钥/密码会以临时文件形式落到仅所有者可访问的工作区(Unix 权限或受保护的 Windows DACL)。参数只包含文件路径,绝不包含注入的凭据值。工具输出会被抑制。正常清理会删除工作区,并在适用时调用 GPG-agent/临时 Keychain 清理。突然终止可能留下明文或辅助进程;不保证安全擦除或进程树隔离。iOS 的临时 Keychain 使用空密码,依赖工作区权限。这不是硬件支持的密钥保管。有意解密的输出是明文文件。
首个 iOS 适配器支持一个已配置描述文件的 .app 及其 frameworks/dylibs,不支持嵌套应用/扩展或链接。代码签名验证不会验证 Apple 配置描述文件的资格。OpenPGP 输出是分离签名或加密数据,不会自动组装 PGP/MIME。格式和平台限制见密码学任务。
CLI 凭据捕获
catch 在提示、读取 stdin 或启动明确指定的来源命令前,要求终端已有 sudo 会话。服务在存储凭据时再次检查授权。捕获只导入受保护的凭据存储;捕获本身不会通过 CLI 或 MCP 暴露凭据读取/导出。
命令捕获只读取 stdout,关闭子进程 stdin,并丢弃子进程 stderr。捕获的文本和解析器错误从不打印。命令失败、超时、输入超限、正则结果有歧义以及 JSON 对象键重复时,不会保存凭据。解析后的 JSON 字符串在成功和解析失败时都会清除;依赖项拥有的临时缓冲区仍受上述内存限制影响。调用者必须信任选定程序:它保留普通操作系统权限,并可能写入自己的文件、日志或网络流量。超时清理终止直接子进程,不终止其后代。捕获是明确的输入/命令处理,不是监视其他终端或键盘输入。现有源文件和 shell 历史保持不变。测试应使用合成数据,并避免将秘密放入命令参数。
云授权
云登录使用带有 PKCE 和 state 验证的浏览器授权码流程。移动端使用 AppAuth 和注册的原生重定向;进入后台会锁定保险库,从浏览器返回后需要重新进行本地授权才能交换令牌。移动端访问/刷新令牌保留在 Rust 内部。前台同步在 FFI 注册表和服务锁之外运行;后台锁定会使迟到的导入、令牌刷新和响应失效。CLI 在服务互斥锁之外与固定 HTTPS 端点交换授权码,然后通过本地认证 IPC 提交令牌。服务要求一次性、有有效期、绑定到调用者/提供方/客户端 ID 的票据,以及当前 sudo。锁定和退出登录使票据失效,也使在途网络请求的响应失效。本地 CLI 仍位于可信操作系统账户边界内。
OAuth 令牌/客户端秘密在设备本地状态内加密,并排除在导出备份、设备配对、保险库同步、搜索和 MCP 之外。状态只暴露账户元数据和到期时间。退出登录删除本地令牌,不撤销提供方侧同意,也不删除本地加密数据库的历史副本。远程撤销使用提供方的已连接应用设置。账户授权不授予保险库访问权限。不可变对象运行器通过 OneDrive 和 Google Drive 应用文件夹排队并应用按接收者加密的保险库信封。提供方适配器和令牌刷新使用本地测试夹具测试;尚未验证真实提供方账户。发件箱/收件箱回执保留在加密设备本地状态中,排除在备份、配对包和 MCP 之外。锁定和退出登录使在途传输确认失效;未完成任务在解锁后仍可恢复。云对象名称是密文哈希,不是保险库标题或账户标识符。
受保护卡片边界
受保护卡片的创建/替换要求 sudo,并原子存储公开元数据卡片与凭据。账户密码、dotenv 值、HTTP 令牌和 OTP 种子从不进入普通全文索引。Dotenv 预览用固定的 *** 掩码处理每个值;通用读取和导出从不返回秘密。明确执行的本地凭据复制操作也支持受保护卡片,包括其种子/令牌/密码,并遵循上述剪贴板边界。普通 MCP 可以搜索普通摘要,但不能创建受保护秘密、生成 OTP 代码或发送经过身份验证的请求。元数据和完整修订内容在静态存储和同步期间均保持加密。
网站登录导入和导出
网站登录是 login 受保护卡片(公开网站 URL 和用户名;密码是存储的凭据)。login_import 要求 sudo 和可写角色;它将浏览器 CSV(在 crates/core 中解析)、只读 Firefox 配置目录、Windows Credential Manager 或已解密导出规范化为同一导入路径。去重在服务边界内以恒定时间比较现有登录的解密密码;相同登录会被跳过,同网站同用户名但密码不同的登录会成为独立卡片,除非给出 --update,且单次导入有上限(2000 行)。浏览器 note 列会被丢弃,除非明确要求保留,因为备注会进入普通索引。Firefox 直接读取仅支持现代 PBES2(PBKDF2-HMAC-SHA256 + AES-256-CBC)key4.db 包装、3DES-CBC 登录值,以及已知或空的主密码;旧版 3DES-PKCS#12 包装只会被报告,不会解密。读取浏览器自身存储不会削弱该浏览器的保护,并受上述操作系统账户边界约束。
login_export 要求 sudo,并拒绝仅限设备的保险库。加密格式(memories/logins/v1)使用 Argon2id 和 XChaCha20-Poly1305,以独立密码封装条目,可以导入任何保险库。Chromium 兼容 CSV 格式是离开加密存储的明文:它是与 credential_copy 类似的明确本地例外,仅允许本地 cli: 调用者使用(绝不允许 MCP、HTTP/中继远程端或移动端 FFI/Share,由调用者允许列表和移动端拒绝列表共同强制执行),在返回明文前提交签名交付意图,并写入仅所有者可访问、已消除电子表格公式注入的文件。操作员必须保护并删除该文件。
TOTP 和 HOTP 生成是明确授权输出短期代码,不是种子导出。生成操作会被审计,但不记录代码或种子。HOTP 在每次生成时,随卡片修订一起持久化递增后的计数器。为了互操作性,支持标准 SHA-1 OTP;应用的其他部分使用其现有的现代认证加密和签名算法。TOTP 要求正确的本地时钟。此客户端不能防止验证方重复使用已接受的代码。otpauth:// URI 导入只接受 totp/hotp 类型;otpauth-migration:// 导入将 Google Authenticator MigrationPayload 导出仅解码为 totp/hotp 卡片,绝不通过搜索或普通 MCP 暴露种子。明确执行的无人值守凭据读取可以披露存储的种子。
客户端控制的仅限设备保险库 ID 持久化在加密状态中。其内容排除在设备配对和导出备份之外,同步/成员导出会被拒绝。机器被攻陷或修改可信客户端可以绕过这些应用级控制。不承诺对已持有共享保险库密码学密钥的授权成员保密。
模板保护专用秘密字段。用户必须避免将秘密放入普通标题、备注、标签和来源字段。导入不会安全擦除现有 dotenv 文件、剪贴板内容或既有 shell 历史。
Wiki 秘密引用
protect_secret 要求本地 sudo 和写访问。它原子创建凭据,并将一个当前记忆/卡片正文中与提供的非空秘密完全匹配的所有内容替换为 {{secret:LABEL}}。带类型的同保险库映射将标签解析为其凭据;标记本身不授予任何访问权限。标签由 1-64 个 ASCII 字母、数字、下划线或连字符组成。秘密同时存在于元数据时会被拒绝,冲突文档和重复使用的标签也会被拒绝。普通编辑保留映射;通用写入不能附加或更改引用。读取、搜索、列表、图谱和 MCP 不解析这些引用。复制在授权后解析当前凭据,并在向本地客户端返回明文前提交不含秘密的审计交付意图。此意图不能证明后续操作系统剪贴板写入成功。剪贴板复制要求不含 NUL 字节的 UTF-8;复制 OTP 卡片交付的是种子,不是生成的一次性代码。
替换只影响当前正文,不影响签名修订历史、恢复归档、其他文档、备份或先前共享的副本。这不是自动秘密发现或提供方侧密钥轮换。已经暴露的密钥必须向其签发方撤销/轮换。新的受保护引用要求更新客户端;旧客户端不能解码新增内容字段。替换规则和客户端行为见使用指南。
资源和操作限制
- Argon2id:64 MiB、三次迭代、一个通道、32 字节输出;固定的版本化参数,16 字节随机盐。不设应用级密码长度限制。
- XChaCha20-Poly1305 使用随机 24 字节 nonce;主密钥、状态、检查点、备份、传输和 256 KiB 内容分块使用独立的认证上下文。
- 每个修订的编码资源正文最多 16 MiB(二进制导入有 base64 开销)。整个加密状态在 SQLite 中以事务方式重写;它面向小型资料库,而不是数 GB 的文件存储。
- 完整同步信封:中继限制为 32 MiB。四个并发房间,每个两个对端,有界队列,每秒 16 个入站帧,60 秒接收闲置限制,连接最长持续十分钟。不提供离线交付。
- 繁忙的可信子进程最多可以占用本地服务五分钟;运行绑定子进程在这段时间内只占用自己的 IPC 连接。HTTPS 操作超时为 30 秒。保留策略为仅追加;审计/版本裁剪和增量同步暂缓实现。
- 权限冲突解决要求同一所有者在两个分支上均保持授权。更复杂的所有权争议会采取关闭式拒绝,并需要未来明确设计的恢复流程。
部署
将中继绑定到 TLS 后方的回环地址。禁用反向代理请求/响应正文日志、磁盘缓冲、核心转储和持久容器卷。TLS 保护传输元数据免遭中间网络窥探;端到端加密保护资源,即使面对 TLS 终止端也有效。示例容器使用非 root 用户。
从客户端备份。中继不是备份系统。单独保存独立备份密码,并在依赖备份之前测试恢复。
向仓库所有者私下报告安全缺陷。不要在公开问题中包含真实密码、凭据值、解密内容或完整生产数据包。