技术文档
系统架构
深入了解NuDefndr的隐私优先架构。 真实实现。可审计代码。
系统概述
设备端处理管道
┌──────────────────────────────────────────────────────────────────┐
│ NUDEFNDR 分析流程 │
└──────────────────────────────────────────────────────────────────┘
用户照片库 (iOS Photos.framework)
│
├─> [PhotoLibraryService: 获取PHAssets]
│ ├─ 增量扫描(基于时间戳的跳过)
│ └─ 目标:最近24小时 / 7天 / 30天 / 90天 / 全部
│
▼
批处理队列
│
├─> [设备感知并发]
│ ├─ A17+设备:6个并发分析
│ ├─ A15/A16:3个并发分析
│ └─ 较旧设备:顺序处理
│
▼
APPLE ML框架 (iOS 18+)
│
├─> [SensitiveContentAnalysis.framework]
│ ├─ 设备端神经引擎处理
│ ├─ 二元分类(敏感/安全)
│ └─ 零网络活动(已验证)
│
▼
结果管道
│
├─> [临时缓存 - 仅RAM]
│ ├─ 结果不持久化
│ └─ 应用终止时清除
│
▼
用户审核
│
└─> [用户操作:移动/复制/忽略]
├─ 移动到保险库 → 加密 + 从照片中删除
├─ 复制到保险库 → 加密 + 保留在照片中
└─ 标记为安全 → 从未来扫描中排除
┌──────────────────────────────────────────────────────────────────┐
│ 隐私保证 │
└──────────────────────────────────────────────────────────────────┘
✓ 分析期间零网络请求
✓ 无云上传(所有处理本地)
✓ 结果未记录或持久化
✓ 分析后清除内存
✓ Apple隐私优先ML框架
神经引擎
在A12+芯片上进行硬件加速的ML处理。分析期间零CPU开销。
沙箱化
iOS应用沙箱防止数据渗漏。分析期间阻止网络请求。
增量
智能时间戳跳过仅在重复扫描时分析新的/修改过的照片。
源代码
增量扫描引擎
> /Services/ScanManager.swift
智能时间戳跳过 (v2.0+)
/// 增量扫描与基于时间戳的跳过逻辑
/// 在重复扫描中提供5-15倍性能提升
func performIncrementalScan(range: ScanRangeOption) async throws {
guard let lastScanDate = getLastSuccessfulScanDate() else {
// 首次扫描 - 分析所有内容
return try await fullScan(range: range)
}
var skippedCount = 0
var analyzedCount = 0
for asset in photoAssets {
// 跳过逻辑:自上次扫描后照片未修改
if let modDate = asset.modificationDate,
modDate < lastScanDate {
skippedCount += 1
continue // 跳过此照片(已分析)
}
// 分析照片(自上次扫描后新的或修改的)
let result = try await analyzer.analyze(asset)
analyzedCount += 1
if result.isSensitive {
await notifyUser(asset)
}
}
#if DEBUG
print("[增量] 已分析: \(analyzedCount), 已跳过: \(skippedCount)")
print("[性能] 跳过率: \(Double(skippedCount)/Double(total) * 100)%")
#endif
// 更新下次扫描的时间戳
saveLastSuccessfulScanDate(Date())
}
/// 性能指标(真实世界数据)
/// v1.7(完整扫描):20张照片28.4秒
/// v2.x(增量):20张照片1.9秒(99%缓存命中)
/// 改进:快15倍,节省87%电量
增量扫描
- ✓ 仅分析新的/修改的照片
- ✓ 基于时间戳的跳过逻辑
- ✓ 重复扫描显著节省时间
- ✓ 更低的电池消耗
- ✓ 高效的内存使用
跳过逻辑
- ✓ 快速时间戳比较
- ✓ 修改日期跟踪
- ✓ 范围边界验证
- ✓ 最小处理开销
- ✓ 针对日常使用优化
保险库加密
ChaCha20-Poly1305加密
> /Vault/VaultCrypto.swift
具有硬件支持的AEAD密码
import CryptoKit
/// ChaCha20-Poly1305用于保险库存储的加密
/// 密钥存储在iOS钥匙串中,具有安全区域保护
final class VaultCrypto {
/// 使用ChaCha20-Poly1305 AEAD加密照片数据
static func encryptData(_ data: Data, key: SymmetricKey) throws -> Data {
// ChaCha20-Poly1305提供:
// - 机密性(加密)
// - 真实性(HMAC)
// - 完整性(篡改检测)
let sealedBox = try ChaChaPoly.seal(data, using: key)
return sealedBox.combined // Nonce + 密文 + Tag
}
/// 解密保险库照片
static func decryptData(_ encryptedData: Data, key: SymmetricKey) throws -> Data {
let sealedBox = try ChaChaPoly.SealedBox(combined: encryptedData)
let decryptedData = try ChaChaPoly.open(sealedBox, using: key)
return decryptedData
}
/// 生成具有熵验证的256位加密密钥 (v2.1.8+)
static func generateVaultKey() throws -> SymmetricKey {
let maxRetries = 3
for attempt in 0..= 7.5 {
return key
}
#if DEBUG
print("[Crypto] 检测到低熵,重试 \(attempt + 1)/\(maxRetries)")
#endif
}
throw CryptoError.insufficientEntropy
}
}
为什么选择CHACHA20-POLY1305?
- ✓ 在ARM上比AES更快(无需硬件AES)
- ✓ 经过身份验证的加密(检测篡改)
- ✓ Signal、WireGuard、TLS 1.3使用
- ✓ 抗时序攻击
- ✓ IETF标准(RFC 8439)
密钥保护
- ✓ 256位密钥(2^256种组合)
- ✓ 具有硬件支持的iOS钥匙串
- ✓ 永不以未加密方式持久化
- ✓ 仅设备(无备份/同步)
- ✓ 熵验证 (v2.1.8+)
规格
技术细节
| 组件 | 实现 | 安全级别 |
|---|---|---|
| ML框架 | Apple SensitiveContentAnalysis (iOS 18+) | 硬件加速 |
| 加密算法 | ChaCha20-Poly1305 AEAD | 256位密钥 |
| 密钥存储 | iOS钥匙串(安全区域) | 硬件支持 |
| 文件保护 | .completeFileProtection | iOS安全存储 |
| 扫描性能 | 增量 (v2.0+) 带时间戳跳过 | 快15倍 |
| 并发 | 设备感知(A17+: 6线程,A15: 3,较旧: 1) | 自适应 |
| 网络活动 | 无(100%离线) | 零云暴露 |
| 越狱检测 | 10向量分析与置信度评分 | 平台感知 |
威胁模型
安全保证
受保护
设备扣押
保险库静态加密。没有FaceID无法读取。
网络拦截
零网络活动。照片永不离开设备。
云泄露
无云存储。一切本地。
备份提取
密钥绑定设备。无法从备份提取。
未经授权访问
需要生物识别 + PIN。30秒后自动锁定。
超出范围
设备已解锁
即使手机已解锁,保险库也需要额外的FaceID。
物理胁迫
无法防止强制生物识别解锁。
越狱设备
iOS安全模型受损(已检测,未阻止)。
操作系统零日
未知的iOS漏洞(影响所有应用)。
可审计代码
开源安全
验证我们的声明
NuDefndr的核心隐私组件在GitHub上开源。 安全研究人员可以独立验证:
- • 分析期间零网络活动(可审计)
- • ChaCha20-Poly1305加密实现
- • 增量扫描算法和跳过逻辑
- • 越狱检测方法
- • 钥匙串集成和密钥生命周期
传输结束
隐私优先架构。 可审计实现。
← 返回首页