North9LLC/Signet
GitHub: North9LLC/Signet
一款在拍摄瞬间嵌入去中心化随机信标签名的水印 SDK,用于从源头证明照片的真实性和拍摄时间。
Stars: 1 | Forks: 0
# Signet
一个供相机应用嵌入以证明照片为真实的加密水印 SDK。
印记生成**在相机应用内部,于按下快门的瞬间完成**——在图像被编码或保存之前。这里没有任何后处理步骤。经过 Signet 认证的照片携带着不可伪造的加密证明,该证明派生自 [drand](https://drand.love/) 公共随机性信标(由 Cloudflare、EPFL、Protocol Labs 运营)。验证是二元的、公开的且非交互式的:要么数学验证通过,要么不通过。
## 工作原理
```
┌─────────────────────────────────────────────────────────────────┐
│ Camera App │
│ │
│ 1. [Background thread, every 25s] │
│ signet_prefetch_round() → cache drand signature │
│ │
│ 2. [Shutter press — synchronous, < 5 ms] │
│ signet_stamp_pixels(raw_pixels, sig) │
│ ↓ invisible LSB watermark embedded │
│ │
│ 3. [Normal encode path] │
│ Encode stamped pixels → JPEG/HEIC/PNG → save to disk │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ Verifier (anyone, anywhere) │
│ │
│ signet_verify_pixels(pixels) → VERIFIED (round + timestamp) │
│ or NOT VERIFIED │
└─────────────────────────────────────────────────────────────────┘
```
**为什么要预取?** drand 每 30 秒发布一个新轮次。应用会在后台缓存签名,因此按下快门的瞬间即可完成——在拍摄时无需网络往返。
**为什么要在应用内进行?** 拍摄后的后处理会产生一个时间窗口,在此期间 AI 生成的图像可能会被提交以进行印记。在拍摄时刻于受信任的应用内嵌入印记可关闭此漏洞。该印记证明:*这些原始像素在此刻存在于该软件之中*。
## SDK 集成
### iOS
```
// AppDelegate or CameraViewController setup
SignetSDK.shared.start() // begins background prefetch
// Inside your AVCapturePhotoCaptureDelegate
func photoOutput(_ output: AVCapturePhotoOutput,
didFinishProcessingPhoto photo: AVCapturePhoto,
error: Error?) {
guard let pixelBuffer = photo.pixelBuffer else { return }
SignetSDK.shared.stamp(pixelBuffer: pixelBuffer) // < 5 ms
// ... encode and save as normal
}
// Verify any image
if let result = SignetSDK.verify(pixelBuffer: pixelBuffer) {
print("VERIFIED: \(result.dateString)") // e.g. "2026-04-25T06:00:00Z"
} else {
print("NOT VERIFIED")
}
```
参见 `sdk/ios/SignetSDK.swift`。
### Android
```
// In your Application or Camera setup
SignetSDK.start()
// In your ImageCapture.OnImageCapturedCallback
val bitmap = imageProxy.toBitmap()
SignetSDK.stamp(bitmap) // < 5 ms, modifies in-place
// ... encode and save
// Verify any image
val result = SignetSDK.verify(bitmap)
if (result != null) {
println("VERIFIED: ${result.isoTime}")
} else {
println("NOT VERIFIED")
}
```
参见 `sdk/android/SignetSDK.kt`。
### C / C++ (任意平台)
```
#include "signet.h"
// Background thread — call every 25 s
char sig_hex[512];
uint64_t round;
signet_prefetch_round(&round, sig_hex, sizeof(sig_hex));
// At shutter press — synchronous, no network
signet_stamp_pixels(pixels_rgb, width, height, sig_hex);
// Verification
uint64_t verified_round, unix_time;
int ok = signet_verify_pixels(pixels_rgb, width, height, &verified_round, &unix_time);
// ok == 1 → VERIFIED, ok == 0 → NOT VERIFIED
```
参见 `include/signet.h`。
## 构建库
```
# Shared library (.so / .dylib)
cargo build --release
# → target/release/libsignet.so (Linux)
# → target/release/libsignet.dylib (macOS)
# Static library (.a) — 用于嵌入到 iOS/Android NDK 构建中
cargo build --release
# → target/release/libsignet.a
# iOS XCFramework (arm64 设备 + x86_64 模拟器)
cargo build --release --target aarch64-apple-ios
cargo build --release --target x86_64-apple-ios
xcodebuild -create-xcframework \
-library target/aarch64-apple-ios/release/libsignet.a \
-library target/x86_64-apple-ios/release/libsignet.a \
-output Signet.xcframework
# Android NDK
cargo build --release --target aarch64-linux-android
cargo build --release --target armv7-linux-androideabi
```
## CLI 参考工具
CLI 是一个参考实现和开发者工具——而非最终用户产品。
```
# 为照片添加 Stamp (用于测试;实际应用在 pipeline 内添加 stamp)
signet stamp photo.jpg
# → photo_stamped.png
# 验证
signet verify photo_stamped.png
# → VERIFIED: round=6052808 time=2026-04-25 06:00:00 UTC
# JSON 输出 (用于工具)
signet verify photo_stamped.png --json
# → {"verified":true,"round":6052808,"time":"2026-04-25 06:00:00"}
# 未添加 Stamp 或 AI 生成的图像
signet verify suspect.jpg
# → NOT VERIFIED: no valid Signet watermark found
```
## 安全模型
**来自 CLI 工具的印记仅用于开发级别。** 设备密钥以明文软件的形式存储在 `~/.signet/device.key` 中。已 Root 的设备或被盗的备份会暴露该密钥。生产环境需要硬件支持的密钥:
- **iOS:** Secure Enclave 集成(尚未实现;参见 `sdk/ios/SignetSDK.swift` 中的 TODO)
- **Android:** StrongBox 集成(尚未实现;参见 `sdk/android/SignetSDK.kt` 中的 TODO)
**设备注册需要带外注册表提交。** CLI 会打印您的公钥和注册表 URL。您必须将密钥提交到 `https://registry.signet.dev`(占位符),验证者才会信任您的印记。`signet enroll` 不会进行自动注册。未注册的设备在验证时会被拒绝。
**Drand 签名会被验证。** 每张带有印记的图像都会引用一个 drand 轮次。验证会确认 `SHA-256(drand_signature) == randomness_field`,以确保信标数据未被篡改。
## 为什么这可以在法庭上作为证据
- **没有模型,没有评分。** drand BLS 签名要么匹配,要么不匹配。二元逻辑。
- **去中心化信标。** 没有任何单一实体控制 drand。过去的轮次签名无法被追溯伪造。
- **非交互式验证。** 任何拥有图像和互联网访问权限的人都可以进行验证。无需专有 API。
- **防篡改。** 有意义的编辑(裁剪、图像修复、合成)会破坏足够多的像素投票,导致 FEC 无法解码。
- **开放标准。** 水印算法、payload 派生和 drand 链全部公开。
**Signet 证明了什么:** 这些像素在声明的 drand 轮次时,未修改地存在于集成了 Signet 的软件中。
**局限性:** Signet 只认证已注册的相机和应用。没有有效水印的图像是未经验证的——不能证明是 AI 生成的。普及率是关键的驱动力:嵌入 Signet 的应用越多,信号就越强。
## 技术细节
| 参数 | 值 |
|---|---|
| Payload | 16-byte HKDF-SHA256(drand signature, "signet-v1") |
| FEC | RS(20,16) over GF(256) — 4 parity bytes, corrects ≤ 2 symbol errors |
| 嵌入位数 | 160 (20 bytes × 8) |
| 嵌入通道 | RGB8 的 Blue channel LSB |
| 扩散 | Bit b → pixels b, b+160, b+320, … |
| 每位投票数 (12 MP) | ~75 000 |
| 最小图像尺寸 | 1 600 pixels |
| drand 网络 | League of Entropy — `https://api.drand.sh/public/{round}` |
| 轮次周期 | 30 seconds |
## 源码目录结构
```
include/
└── signet.h C header (FFI API)
sdk/
├── ios/SignetSDK.swift iOS drop-in integration
└── android/SignetSDK.kt Android drop-in integration
src/
├── main.rs CLI reference tool
├── lib.rs Library root + C FFI exports
├── imgwm.rs Spread-spectrum embed + majority-vote extract
├── fec.rs Reed-Solomon RS(20,16) over GF(256)
├── crypto.rs HKDF-SHA256, CRC-32
├── payload.rs drand signature → 16-byte payload
├── drand.rs HTTP fetch, round/timestamp helpers
├── modem.rs Audio AFSK (legacy)
└── wav.rs WAV I/O (legacy)
```
## 许可证
Signet 采用双重许可:
- **开源:** [GNU Affero General Public License v3.0](LICENSE) — 对开源相机应用和个人项目免费
- **商业:** 对于专有应用、政府/执法部门、企业或 OEM SDK 使用,请联系 [licensing@north9.org](mailto:licensing@north9.org)
详情请参阅 [LICENSE-COMMERCIAL](LICENSE-COMMERCIAL)。
标签:AIGC检测, Cloudflare, CVE, Deepfake防御, drand, EPFL, HEIC, JPEG, LSB隐写, MITRE ATT&CK, PNG, Protocol Labs, UML, 不可伪造证明, 公共随机信标, 内容认证, 加密验证, 可视化界面, 图像取证, 图像防篡改, 媒体真实, 密码学水印, 数字水印, 数字签名, 照片, 照片防伪, 相机SDK, 相机应用, 真实性验证, 网络安全, 通知系统, 防伪溯源, 防伪造, 隐私保护, 零信任验证, 非交互式验证