PRYSYM/ois-sign
GitHub: PRYSYM/ois-sign
OIS Sign 是一个利用 passkey 硬件身份为网页内容签名并支持离线验证的轻量级工具,填补了个人用户在内容防篡改和伪匿名身份证明方面的空白。
Stars: 0 | Forks: 0
# OIS Sign — 用指纹为你的网页内容签名
[规范](specs/signature-block.md) · [在线演示](examples/static-html/index.html) · [常见问题](docs/faq.md) · [分发计划](_plans/ois-signed-web.md)
## 仓库内容
| 路径 | 说明 | 状态 |
|---|---|---|
| `packages/sign-core/` | `@ois/sign-core` — 原生 JS 签名及验证库 (浏览器 + Node) | v0.1.0 |
| `packages/extension/` | MV3 浏览器扩展 (Chrome/Firefox) — 页面内验证 | v0.1.0 |
| `packages/wordpress-plugin/` | Gutenberg 区块 — 添加“Sign this post”按钮 | v0.1.0 |
| `packages/markdown-cli/` | `ois-sign` — 用于签名 Markdown / HTML / 文本文件的 CLI | v0.1.0 |
| `specs/` | OIS-SIGN-v1 协议规范 | 草稿 |
| `test-vectors/` | 跨实现的一致性测试向量 | 6 组测试向量 |
| `examples/static-html/` | 在浏览器中使用 passkey 签名的单文件演示 | 可运行 |
| `examples/astro-blog/` | 在构建时签名的静态博客 | 可运行 |
| `docs/` | 着陆页 (`docs/index.html`),常见问题,采用者列表 | |
## 太长不看 — 为什么会有这个项目?
| 现有方案 | 为什么不适合个人用户 |
|---|---|
| C2PA / Content Credentials | 面向发布商级别 (Adobe, NYT)。需要 CA 颁发的证书。 |
| Sigstore / Cosign | 面向代码制品。需要 OIDC 登录。 |
| ENS / Web3 域名 | 需要消耗 Gas。基于钱包,而非硬件。 |
| Worldcoin / 球体扫描 | 中心化,生物识别。 |
| 平台“已认证”徽章 | 绑定特定平台,需付费,需 KYC。 |
OIS Sign 填补了缺失的底层原语:免费、硬件 backing、伪匿名、跨平台、可离线验证。
## 快速开始
### 运行单元测试 + 一致性测试向量
```
git clone https://github.com/PRYSYM/ois-sign
cd ois-sign
npm install
npm test # 35 unit tests
npm run test:vectors # 6 conformance vectors
```
### 试试静态 HTML 演示
```
npx serve . # serve the repo root
# 打开 http://localhost:3000/examples/static-html/
```
点击 **Sign this article** → 浏览器弹出 passkey 提示,派生出 3 个符号的身份标识,嵌入一个 `` 区块。点击 **Verify the signature** → 状态变为 `VERIFIED_OFFLINE`。
### 从 CLI 签名 Markdown 文件
```
npm link --workspace=@ois/sign-cli
ois-sign keygen ./mykey.pem
ois-sign whoami ./mykey.pem # → ⚙-🌊-🔥 — gear-wave-fire
ois-sign sign post.md --key ./mykey.pem --inline-key
ois-sign verify post.md # → VERIFIED_OFFLINE
```
### 加载浏览器扩展 (解压版,用于开发)
```
node packages/extension/build.mjs # copies sign-core into lib/
```
然后在 Chrome 中:`chrome://extensions` → 开发者模式 → “加载已解压的扩展程序” → 选择 `packages/extension/`。在 Firefox 中:`about:debugging` → 此 Firefox → “临时载入附加组件” → 选择 `packages/extension/manifest.json`。
签名后访问 `examples/static-html/index.html` —— 文章旁边会出现一个绿色的“Signed”徽章。
### 安装 WordPress 插件 (本地)
```
node packages/wordpress-plugin/build.mjs
```
将 `packages/wordpress-plugin/` 复制到 `wp-content/plugins/ois-sign/` 中,在 WP Admin 中激活它,在 Settings → OIS Sign 下配置 discovery URL,然后将 "OIS Sign" 区块添加到文章中并点击 "Sign this post"。
## 工作原理 (一图看懂)
```
┌──────────────────────┐
author's browser │ passkey (P-256) │
└──────────┬───────────┘
│ navigator.credentials.get()
content + scope ▼
+---------+ canonicalize + hash signed_bytes =
content ──▶ | core │ ──────────────────────────▶ "OIS-SIGN-v1\n..."
+---------+ │
▼
ECDSA-P256-SHA256
│
▼
reader's browser ──▶ extension scans DOM, finds
recompute hash, verify ECDSA, re-derive symbol-id
──▶ "Signed · ⚙-🌊-🔥"
```
有关完整详情,请参阅 [`specs/signature-block.md`](specs/signature-block.md) 和 [`specs/canonicalization.md`](specs/canonicalization.md)。
## 安全模型 (一图看懂)
| 威胁 | 防御机制 |
|---|---|
| 在不同内容上重放签名 | 内容哈希绑定在签名字节中 |
| 恶意的 discovery 返回错误密钥 | 验证者从密钥重新派生符号 —— 不匹配则返回 `INVALID` |
| 伪造签名 | P-256 ECDSA —— 没有私钥则无法实现 |
| AI 生成的冒充内容 | 同伪造签名防御机制 |
| 签名被平台剥离 | 降级为 `UNVERIFIED`,绝不会误报为 `VERIFIED` |
## 许可证
MIT。请参阅 [LICENSE](LICENSE)。
属于 [Open Identity Symbols](https://github.com/PRYSYM/open-identity-symbols) 生态系统的一部分。
标签:Astro博客, CMS安全, DID, Firefox扩展, GNU通用公共许可证, Gutenberg区块, JavaScript, MITM代理, MV3扩展, Node.js, Passkey, SEO安全, Web3.0, WebAuthn, Web标准, WordPress插件, 伪匿名, 公钥密码学, 内容真实性, 内容签名, 内容防篡改, 前端安全, 去中心化身份, 开源协议, 抗伪造, 数字版权, 数据可视化, 文档结构分析, 无密码认证, 浏览器扩展, 硬件-backed安全, 离线验证, 自定义脚本