知识库 在引擎盖下
验证构建
仅当您正在运行的代码是以前的代码时,开源才有帮助 发表。 Nymchat 是确定性构建的,因此您可以从内部自行检查 应用程序或从终端。
为了方便起见,此页面是机器翻译的。英文原件为适用版本。
可重复的构建
构建应用程序会发出 build-manifest.json 包含源提交,a
每个服务的 HTML、JavaScript 和 CSS 资产的 SHA-256 哈希值以及单个
bundleHash 整个资产集。
输出仅取决于源内容 - 甚至记录的构建时间也是
提交的时间戳而不是构建运行的时刻——因此任何人都可以重建相同的时间戳
commit 得到字节相同的文件并且相同 bundleHash.
然后,GitHub Action 独立重建每个提交并签署构建来源
哈希和清单的证明,因此有一个签名记录绑定
bundleHash 到存储库中的提交,由除
部署。
关于对话框检查的内容
关于 在标题中,在浏览器中实时运行检查。
它重新获取页面实际运行的每个资产,使用 Web Crypto API 对其进行哈希处理,然后
与清单进行比较。然后——这是重要的部分——
重新计算 bundleHash 从哈希值 它 只是计算出来的,不是从
清单声明的任何内容,并在存储库的签名证明中查找
通过 GitHub API。
这就是阻止部署为其自身提供担保的原因:将修改后的文件与 匹配清单仍然失败,因为重新计算的哈希没有证明。
| 地位 | 方法 |
|---|---|
| &查看;已验证的官方应用程序 (n/n) | 每个资产都匹配,重新计算的捆绑散列由存储库证明, 和 该页面由官方域提供。 |
| ⚠ 已验证版本·不是官方应用程序 | 该代码是真实的且经过验证的,但这是另一个域上的镜像。如果验证失败,镜像将无法删除此警告。 |
| ✗ 不匹配 | 资产不会根据清单内容进行哈希处理。 |
| ✗ 非官方构建 | 重新计算的捆绑散列没有来自存储库的证明——一个自制的清单。 |
| ⚠ 无法获取出处 | 无法访问 GitHub API,因此无法以任何方式检查证明。 |
自己验证一下
重建提交“关于”对话框名称并进行比较:
git clone https://github.com/Spl0itable/NYM
cd NYM
git checkout <commit shown in the About dialog>
npm ci
npm run build # prints "Build hash: <bundleHash>"
打印的哈希值应与“关于”对话框中的哈希值和该提交的哈希值相匹配 构建来源运行摘要。您还可以直接使用 GitHub CLI 检查签名:
gh attestation verify dist/build-manifest.json --repo Spl0itable/NYM
Android 和 iOS 应用程序
上面的检查是一个网络应用程序检查,其原因值得明确说明:一个本机应用程序 不能对自己做同样的事情。你手机上运行的是编译后的机器代码,而不是 源在存储库中,并且应用程序可以在设备上计算的任何内容都与 其他。
Android 可以退而求其次。已安装的 .apk 是应用程序可以读取的文件
和哈希值,并且每个已发布版本的哈希值已经是公开的:发布到
Zapstore
签署携带 APK 的 SHA-256 及其签名证书的 SHA-256 的 Nostr 事件。所以
安卓 关于 对话框对运行它的 APK 进行哈希处理,获取已签名的 APK
事件,仅保留由开发人员密钥签名的事件并进行比较。它显示了两个
哈希值也是如此,因此您可以在设备上重复检查:下载已发布的 APK,运行
sha256sum 并亲自观察同一事件。
无法通过这种方式检查从 Google Play 安装的应用程序,这不是一个迹象,任何事情都是错误的。谷歌用自己的密钥重新签名每个上传,并为每个设备构建一个单独的APK,所以在你的手机上降落的不是开发者制作的文件,它的哈希匹配任何可以发布的内容。
iOS根本无法检查。 Apple 会对每次下载进行加密和重新签名 单独的,因此在您的 iPhone 上计算的哈希对于您的 iPhone 来说是唯一的,并且不会匹配任何内容 在任何地方发布。 “关于”对话框直接说明了这一点,而不是显示出令人放心的内容 毫无意义的状态。如果您想要可以在 Apple 硬件上验证的 Nymchat,请使用网络 应用程序,它会检查它正在运行的每个文件。
对应用程序本身运行的检查无法证明该应用程序是诚实的——无论是谁修改了它 也可以删除支票。它证明的是普通情况:您的副本 安装的是已发布的副本。这是值得拥有的,因为它很有价值 比较是公开的,因此除了您之外的其他人可以检查它们并提出不同意见。
权证金丝雀
权证金丝雀是一种按固定时间表发布的声明,表明开发商已 不是 收到一项禁止透露的政府秘密命令—— 国家安全信函,FISA 命令。开发商可能被迫保持沉默 这样的命令,但不能强迫撒谎,所以金丝雀变质或消失是 本身就是信号。
它住在 canary.json 位于存储库的根目录并直接获取
来自 GitHub,因此其历史记录是可审计的,与部署的站点所说的无关。
关于对话框对其进行颜色编码:
| 颜色 | 方法 |
|---|---|
| 绿色的 — 全部清除 | 已签名、当前且签名与开发人员的密钥匹配。尚未收到任何秘密命令。 |
| 黄色的 — 逾期或未全部清除 | 它没有在规定的日期或它的 allClear 标志是假的。不能排除沉默令。 |
| 红色的 — 签名无效或消失 | 签名与开发人员的密钥不匹配,或者文件已被完全删除。将此视为严重警告。 |
新鲜度锚
签名的金丝雀嵌入了签名时最新的比特币区块高度和哈希值。 在区块存在之前,不可能知道该哈希值,这证明金丝雀是 签署 后 一个特定的时间点,而不是几个月前批量预先签署。 “关于”对话框将锚点链接到块资源管理器,以便您可以检查它。