Skip to content

Security: zzemy/SmartProximity-Lock

Security

docs/security.md

SmartProximity Lock - 安全架构设计

版本: 1.0.0
最后更新: 2025-12-10


1. 安全原则

本项目遵循以下核心安全原则:

  1. 零信任 (Zero Trust): 不信任任何网络传输的数据,所有通信必须经过验证。
  2. 私钥不离身: 私钥永远存储在 Android TEE (Trusted Execution Environment) 中,绝不传输。
  3. 基于挑战-响应 (Challenge-Response): 绝不传输静态密码,每次解锁使用一次性随机数 (Nonce)。
  4. Windows Hello 集成: 使用微软官方 CDF (Companion Device Framework) 框架,不使用模拟键盘输入等不安全方式。

2. 密钥管理体系

2.1 Android 端 (GATT Server)

  • 密钥存储: 使用 AndroidKeyStore 系统。
  • 密钥类型: RSA 2048-bit 或 NIST P-256 (ECC)。
  • 保护级别:
    • KeyGenParameterSpec.Builder.setIsStrongBoxBacked(true) (如果硬件支持 StrongBox)。
    • setUserAuthenticationRequired(true): 强制要求用户生物识别 (指纹/人脸) 才能使用私钥签名 (可选配置)。
  • 生命周期:
    • App 安装时生成密钥对。
    • App 卸载或清除数据时密钥销毁。
    • 私钥不可导出 (setExported(false) is default for private keys).

2.2 Windows 端 (GATT Client)

  • 公钥存储:
    • 在设备注册阶段,Windows 获取 Android 端的公钥。
    • 公钥与 DeviceId 绑定,存储在 Windows CDF 框架的受保护存储区中。
  • TPM 集成: Windows Hello 可能会利用 TPM 保护认证凭据。

3. 认证流程详解 (Challenge-Response)

3.1 注册流程 (Binding)

  1. 发现: Windows 扫描到 Android 设备。
  2. 交换: Android 发送公钥 (Public Key) 和设备 ID 给 Windows。
  3. 注册: Windows 调用 SecondaryAuthenticationFactorRegistration.RequestStartRegisteringDeviceAsync()
    • 将 Android 设备 ID 和公钥注册到 Windows 系统。
    • Windows 可能会要求用户输入一次 PIN 码或密码以确认添加信任设备。

3.2 解锁流程 (Authentication)

  1. 触发: Windows 检测到蓝牙信号强度满足阈值 (RSSI > -60dBm)。
  2. 挑战生成:
    • Windows 调用 SecondaryAuthenticationFactorAuthentication.StartAuthenticationAsync()
    • 系统生成一个加密的 Nonce (挑战码)。
  3. 传输: Windows 通过 BLE Characteristic (0xAA11) 将 Nonce 发送给 Android。
  4. 签名:
    • Android 收到 Nonce
    • (可选) Android 弹出生物识别提示。
    • 验证通过后,Android 使用 Keystore 中的 私钥Nonce 进行签名 (SHA256withRSA / SHA256withECDSA)。
  5. 响应: Android 将签名结果通过 BLE Characteristic (0xAA12) 发回 Windows。
  6. 验证:
    • Windows 接收签名。
    • 调用 SecondaryAuthenticationFactorAuthentication.FinishAuthenticationAsync()
    • Windows 系统内部验证签名是否由注册的公钥生成。
  7. 结果:
    • 验证成功 -> 解锁 Windows 会话。
    • 验证失败 -> 保持锁定,记录安全事件。

4. 威胁模型与防御

威胁 描述 防御措施
重放攻击 (Replay Attack) 攻击者录制之前的签名数据,试图再次解锁。 Nonce 机制: 每次解锁的 Nonce 都是随机且唯一的,旧的签名对新的 Nonce 无效。
中间人攻击 (MITM) 攻击者拦截 BLE 通信,篡改数据。 1. BLE Bonding: 强制使用蓝牙配对加密链路。
2. 签名验证: 攻击者没有私钥,无法伪造有效的签名。
设备盗窃 手机被盗。 生物识别强制: 配置 Android Keystore 要求指纹验证才能签名,窃贼无法使用私钥。
蓝牙嗅探 攻击者监听蓝牙信号。 BLE 链路层加密;且传输的数据中不包含任何密码或敏感个人信息,只有随机数和签名。
恶意 App 伪装 恶意 Windows App 伪装成锁屏服务。 UWP 应用需声明 windows.authentication.web 权限,且需经过微软商店审核或企业签名;CDF 框架由系统级服务 LogonUI 调用。

5. Windows CDF API 参考

  • Namespace: Windows.Security.Authentication.Identity.Provider
  • 关键类:
    • SecondaryAuthenticationFactorRegistration: 用于注册配套设备。
    • SecondaryAuthenticationFactorAuthentication: 用于执行认证流程。
    • SecondaryAuthenticationFactorDevicePresence: 用于通知系统设备是否在附近 (可选)。

6. Android Keystore API 参考

  • Class: java.security.KeyStore
  • Generator: android.security.keystore.KeyGenParameterSpec
  • Signature: java.security.Signature

注意: 本文档是安全实现的基准,任何代码实现必须严格遵守上述流程。

There aren't any published security advisories