$ ./verify.sh --deployment
部署验证
此页面让你确认服务器上运行的代码与公开开源仓库一致,且浏览器内的密码学实现完全正确。
开源策略说明
PingVaults 采用「核心开源 + 商业闭源」策略。唯一触碰你明文和答案的加密层完全开源可审计;其余业务逻辑(UI、Inactivity Switch、数据库操作)为商业代码。
pingvaults-crypto ↗
加密核心 · MIT 开源 · 含完整测试向量和离线解密器
PingVaults (main) — 商业闭源
UI · 业务逻辑 · Inactivity Switch · API 路由
// 为什么这样设计:加密层开源,让你无需盲目信任我们的算法。业务层闭源,保护商业利益防止原封不动抄袭。就算业务层「作恶」,服务器拿到的也是它永远无法解开的密文。
关键源文件哈希
SHA-256 于构建时计算sha256sum <file>所得结果。你可运行下方命令在本地重现并比对。本地验证命令:
curl -sL "https://raw.githubusercontent.com/milshop/pingvaults-crypto/main/src/crypto.ts" | sha256sum期望值: cc5d4fcab2e13d7e14e9f0b63f92dd4832e0f68797ed9a57109c030755c9bde3
本地验证命令:
curl -sL "https://raw.githubusercontent.com/milshop/pingvaults-crypto/main/components/VaultForm.tsx" | sha256sum期望值: 3cd6010526e90ff9cb9e755772d77c1850ea19c3fc4443e87cb09aacbb4d36a3
若命令输出与期望值一致,说明线上构建所用源码与 GitHub 完全相同,未经篡改。
一键批量验证脚本
自动检查所有关键文件,输出 ✓ / ✗ 结果
使用方法(复制脚本后):
macOS pbpaste | bash
Linux xclip -o | bash (或保存为 verify.sh && bash verify.sh)
脚本将逐一下载 GitHub 原始文件并计算 SHA-256,与页面期望值比对,全部 ✓ 则说明构建未被篡改。
浏览器出站请求限制(CSP)
Content Security Policy 是浏览器强制执行的规则,限制本页面 JS 只能向以下地址发送网络请求。这意味着你的密语答案、密钥等信息在浏览器内,无法被发送到任何未列出的服务器——浏览器本身保证这一点,而不是我们的承诺。
如何验证:打开 DevTools(F12)→ Network → 选任意请求 → Response Headers → 找到 Content-Security-Policy
允许的出站地址(connect-src):
'self'同域所有 /api/* 路由(见下方详情)/api/vault/save保存加密金库(密文 + TxID + 密钥结构写入数据库)/api/vault/fetch读取金库元数据(TxID、salt、iv、密钥结构)/api/vault/delete删除金库记录/api/ping/*查询/重置/删除 Inactivity Switch 配置及签到/api/auth/*邮箱 OTP 发送与验证、Google OAuth、session 管理uploader.irys.xyzIrys 上传端点gateway.irys.xyzIrys 读取网关arweave.netArweave 备用网关ar-io.devArweave 备用网关accounts.google.comGoogle OAuth 登录如何验证 'self' API 没有发送你的答案?
CSP 只能限制「发往哪里」,无法阻止 JS 把敏感信息发给自己的 /api。以下两种方式可以亲自核查:
1. 打开 DevTools(F12)→ Network 标签
2. 进入加密页面,填写资产线索,点「加密并上传」
3. 找到 /api/vault/save → 点击 → 查看 Payload / Request Body
✓ 你会看到:ciphertext(密文)、txId、salt、iv、keySchema(题面)—— 没有任何答案字段
以下 API 路由已在 pingvaults-crypto 公开,可直接阅读源码确认服务端接收字段:
任何向未列出地址(如第三方收集服务器)的 fetch() 请求,浏览器会直接拦截并报错。你可以在 DevTools Console 里看到 CSP 违规日志。
JS Bundle 完整性
主仓库为商业闭源,无法通过克隆本地构建来验证 JS Bundle。但关键源文件已在 pingvaults-crypto 公开,上方的「源文件哈希」验证覆盖了最重要的部分。以下是三个递进验证层级,供不同需求的用户参考。
// L1(源码验证)是主要验证手段,L2 是进阶补充,L3 因主仓库私有暂不可用。
L1 · 源文件哈希验证(推荐)
使用上方的「一键批量验证脚本」,通过 curl 从 pingvaults-crypto 公开仓库下载所有关键源文件,重新计算 SHA-256 并与构建时哈希比对。这是目前最有力的验证方式。
→ 见上方「一键批量验证脚本」
L2 · 线上 Bundle 哈希(进阶)
下载浏览器实际加载的编译后 JS chunk,计算其 SHA-256。可以在不同时间或不同网络环境下重复验证,确认 CDN 没有在传输过程中替换 bundle。
→ 在 DevTools → Network 找到 chunk 文件名,替换下方命令中的 HASH
curl -sL "https://www.pingvaults.com/_next/static/chunks/HASH.js" | openssl dgst -sha256 -binary | base64// 对大多数用户而言,L1 已足够:源文件哈希 + CSP 限制 = 答案无法被发送到任何未授权地址,且加密逻辑可独立审计。
密码学自测
在你的浏览器内执行完整的 AES-256-GCM 加密→解密往返测试,使用的是保护你金库的同一套代码。任何数据都不会离开你的设备。
测试向量:
plaintext "PingVaults crypto OK ✓"
name "Alice"
question "Verify?" → "yes"
algo PBKDF2-SHA256 × 600,000 → AES-256-GCM
这两个单文件 HTML 实现了完整解密流程,无任何外部依赖。下载后在任何浏览器打开,通过 Ctrl+U 可审计全部源码。
这是终极保障:即使 PingVaults.com 关闭,紧急联系人也能仅凭此 HTML 文件和元数据 JSON 解密金库。