技术文档

系统架构

深入了解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加密实现
  • 增量扫描算法和跳过逻辑
  • 越狱检测方法
  • 钥匙串集成和密钥生命周期

传输结束

隐私优先架构。 可审计实现。

← 返回首页