跳转到内容

安全与数据存储

NetShuttle 把 Profile 与 Secret 分开保存。服务器和隧道配置以密文存储,密码、私钥口令和 OTP 以独立 Secret 记录存储;Keychain 只保存随机生成的主密钥。

  • 使用 CryptoKit AES.GCM 与 256 位主密钥。
  • SealedBox.combined 保存 nonce、ciphertext 和 authentication tag。
  • AAD 绑定 schema 版本、记录 ID、记录类型和存储域,防止密文跨记录替换。
  • 每个文件先写临时文件,再落盘并原子替换。
  • 解密或认证失败时不覆盖已有数据。

文件布局:

Profiles/<uuid>.profile.enc
Secrets/<profile-uuid>.<kind>.secret.enc

免费版本使用 App 沙盒中的加密存储。本地主密钥保存在 Keychain,并使用 ThisDeviceOnly 级别的访问控制。macOS 优先使用 Touch ID;没有可用生物识别或识别被锁定时,可回退到设备登录密码。

Premium 使用 App 的 iCloud Drive 容器:

Documents/NetShuttle/Storage/v1

iCloud 主密钥使用独立 account 和 synchronizable Keychain。iCloud 未启用、未登录或密钥尚未同步时返回可恢复错误,不会创建第二把同名主密钥。

读写使用 NSFileCoordinator。当冲突版本无法安全判断时,应用保留冲突副本,不静默覆盖。

购买 Premium 或权限失效时,DataMigrator 在 Local 与 iCloud Provider 之间双向迁移:

  1. 读取源 Provider 并解密 Profile 与 Secret。
  2. 使用目标 Provider 的主密钥重新加密,禁止复制原密文。
  3. 从目标 Provider 回读并逐项比较。
  4. 全部验证成功后原子提交活动存储模式。
  5. 保留源数据用于回滚,下一次启动成功后再清理。

迁移失败、用户取消认证或 iCloud 暂时不可用时,应用继续使用源 Provider,不提前切换,也不产生双端分叉写入。

日志位于本地 Application Support,不参与 iCloud 同步。运行状态、临时 Shell 会话和日志也不会写入云同步目录。