$ ./verify.sh --deployment
部署验证
检查部署构建标识、比对公开组件哈希,并独立审计开源的浏览器密码学实现。
开源策略说明
PingVaults 公开密码学模块、安全关键 UI/API 快照、测试向量和离线解密器供审查;其余应用、构建流水线、调度、账单和部署仍是独立的专有信任边界。
pingvaults-crypto ↗
加密核心 · MIT 开源 · 含完整测试向量和离线解密器
PingVaults (main) — 商业闭源
其余应用 · 构建部署 · 账单 · 失联调度器
// 为什么这样设计:公开的加密层可被独立审计;业务层仍为专有代码,因此部署控制和网络行为属于需要分别核查的信任边界。
关键源文件哈希
SHA-256 于构建时计算sha256sum <file>所得结果。对于已公开文件,可运行下方命令与对应 GitHub 文件比对。本地验证命令:
curl -sL "https://raw.githubusercontent.com/milshop/pingvaults-crypto/f4355e96783f9764c2c8c3e3180d1613229c47fa/src/crypto.ts" | sha256sum期望值: c9b3f06e77475f75852fb336d541ab7e87bcfda098cdfe0eaaa07f0c511f8d0c
本地验证命令:
curl -sL "https://raw.githubusercontent.com/milshop/pingvaults-crypto/f4355e96783f9764c2c8c3e3180d1613229c47fa/components/VaultForm.tsx" | sha256sum期望值: 850a0a8035197af89675c3a07ac5013bf142832e4461e5565e7c3617e493a2e7
哈希一致只证明该公开源文件内容相同,不能证明专有应用、构建流水线或提供期望值的页面本身完整。
一键批量验证脚本
自动检查所有关键文件,输出 ✓ / ✗ 结果
使用方法(复制脚本后):
macOS pbpaste | bash
Linux xclip -o | bash (或保存为 verify.sh && bash verify.sh)
脚本会下载 GitHub 上已公开的源文件,并将 SHA-256 与当前构建显示的值比对。相同只能证明文件一致,不能证明专有应用层或提供期望哈希的页面本身完整。
浏览器出站请求限制(CSP)
Content Security Policy 会限制页面 JavaScript 可以连接的跨域目标。它是一项浏览器强制控制,但同源 API 仍被允许,需要结合源码和网络检查评估。
如何验证:打开 DevTools(F12)→ Network → 选任意请求 → Response Headers → 找到 Content-Security-Policy
允许的出站地址(connect-src):
'self'同域所有 /api/* 路由(见下方详情)/api/vault/save保存加密金库(密文 + TxID + 密钥结构写入数据库)/api/vault/fetch读取金库元数据(TxID、salt、iv、密钥结构)/api/ping/*查询、配置和重置 Inactivity Switch 设置及签到/api/auth/*邮箱 OTP 发送与验证、Google OAuth、session 管理uploader.irys.xyzIrys 上传端点(早期金库)gateway.irys.xyzIrys 读取网关(早期金库)arweave.netArweave 备用网关turbo-gateway.com新上传使用的 Arweave 网关ar-io.devArweave 备用网关accounts.google.comGoogle OAuth 登录checkout.stripe.comStripe 托管结账页api.stripe.comStripe 浏览器 API如何验证 'self' API 没有发送你的答案?
CSP 只能限制「发往哪里」,无法阻止 JS 把敏感信息发给自己的 /api。以下两种方式可以亲自核查:
1. 打开 DevTools(F12)→ Network 标签
2. 进入加密页面,填写资产线索,点「加密并上传」
3. 找到 /api/vault/save → 点击 → 查看 Payload / Request Body
预期可见:ciphertext、salt、IV、恢复结构和 Ping 设置;不包含恢复短语或派生密钥
以下 API 路由快照已发布在 pingvaults-crypto。请比对哈希、阅读预期行为,并在 DevTools 中单独确认线上请求:
向 connect-src 未列出的跨域地址发起 fetch 会被浏览器阻止并报告 CSP 违规;向已列出的地址(包括同源 API)发请求仍然可行。
JS Bundle 完整性
主仓库为商业闭源,因此无法进行独立的可复现构建。公开源文件和线上 Bundle 哈希可作为比对证据,但都不能独立证明完整线上应用。
// L1(源码验证)是主要验证手段,L2 是进阶补充,L3 因主仓库私有暂不可用。
L1 · 源文件哈希验证(推荐)
使用批量脚本下载已公开文件,重新计算 SHA-256,并与当前构建显示的值比对;这可以确认它们与相应公开文件一致。
→ 见上方「一键批量验证脚本」
L2 · 线上 Bundle 哈希(进阶)
下载浏览器实际加载的 JS chunk 并记录 SHA-256。在不同时间或网络重复检查可以发现不一致交付,但无法判断一个稳定 Bundle 本身是否可信。
→ 在 DevTools → Network 找到 chunk 文件名,替换下方命令中的 HASH
curl -sL "https://www.pingvaults.com/_next/static/chunks/HASH.js" | openssl dgst -sha256 -binary | base64// 这些检查提供关于公开文件和已观察网络边界的证据,但不是对专有部署的完整证明。
密码学自测
在当前页面使用共享密码学模块执行 AES-256-GCM 加密→解密往返测试;测试本身不会发起网络请求。
测试向量:
plaintext "PingVaults crypto OK ✓"
name "Alice"
prompt "Enter the test recovery phrase"
algo PBKDF2-SHA256 × 600,000 → AES-256-GCM
这两个单文件 HTML 无需加载外部脚本即可完成本地解密。下载后可在兼容的现代浏览器打开,并通过“查看源代码”检查实现。
保存好的 HTML 解密器、导出的元数据 JSON 和单独保管的恢复短语,可以在没有 PingVaults 账号或在线服务时完成恢复。