$ ./verify.sh --deployment

部署验证

此页面让你确认服务器上运行的代码与公开开源仓库一致,且浏览器内的密码学实现完全正确。

01
实时验证

开源策略说明

PingVaults 采用「核心开源 + 商业闭源」策略。唯一触碰你明文和答案的加密层完全开源可审计;其余业务逻辑(UI、Inactivity Switch、数据库操作)为商业代码。

📂

pingvaults-crypto ↗

加密核心 · MIT 开源 · 含完整测试向量和离线解密器

🔒

PingVaults (main) — 商业闭源

UI · 业务逻辑 · Inactivity Switch · API 路由

// 为什么这样设计:加密层开源,让你无需盲目信任我们的算法。业务层闭源,保护商业利益防止原封不动抄袭。就算业务层「作恶」,服务器拿到的也是它永远无法解开的密文。

关键源文件哈希

SHA-256 于构建时计算
右侧哈希 = 构建时对 GitHub 原始文件执行sha256sum <file>所得结果。你可运行下方命令在本地重现并比对。
文件SHA-256 (构建时)
lib/crypto.tsopen source
cc5d4fcab2e1…

本地验证命令:

curl -sL "https://raw.githubusercontent.com/milshop/pingvaults-crypto/main/src/crypto.ts" | sha256sum

期望值: cc5d4fcab2e13d7e14e9f0b63f92dd4832e0f68797ed9a57109c030755c9bde3

3cd6010526e9…

本地验证命令:

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。以下两种方式可以亲自核查:

L1实时抓包(最直接)

1. 打开 DevTools(F12)→ Network 标签

2. 进入加密页面,填写资产线索,点「加密并上传」

3. 找到 /api/vault/save → 点击 → 查看 Payload / Request Body

✓ 你会看到:ciphertext(密文)、txId、salt、iv、keySchema(题面)—— 没有任何答案字段

L2对照开源 API 路由(代码级)

以下 API 路由已在 pingvaults-crypto 公开,可直接阅读源码确认服务端接收字段:

任何向未列出地址(如第三方收集服务器)的 fetch() 请求,浏览器会直接拦截并报错。你可以在 DevTools Console 里看到 CSP 违规日志。

JS Bundle 完整性

主仓库为商业闭源,无法通过克隆本地构建来验证 JS Bundle。但关键源文件已在 pingvaults-crypto 公开,上方的「源文件哈希」验证覆盖了最重要的部分。以下是三个递进验证层级,供不同需求的用户参考。

// L1(源码验证)是主要验证手段,L2 是进阶补充,L3 因主仓库私有暂不可用。

L1

L1 · 源文件哈希验证(推荐)

使用上方的「一键批量验证脚本」,通过 curl 从 pingvaults-crypto 公开仓库下载所有关键源文件,重新计算 SHA-256 并与构建时哈希比对。这是目前最有力的验证方式。

→ 见上方「一键批量验证脚本」

L2

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

02
离线解密器(零服务器依赖)

这两个单文件 HTML 实现了完整解密流程,无任何外部依赖。下载后在任何浏览器打开,通过 Ctrl+U 可审计全部源码。

这是终极保障:即使 PingVaults.com 关闭,紧急联系人也能仅凭此 HTML 文件和元数据 JSON 解密金库。