Skip to content

设备过环境

第一章:常见名词

一、Play Integrity (PI)

文章参考:Play Integrity API - replacement for SafetyNet | XDA Forums

您是否遇到过这样的问题:

  • Google Wallet (数字钱包) 非接触式支付 (NFC) 无法使用 - “设备未能满足安全要求”。
  • Play 商店报告您的设备与应用程序不兼容。
  • Play Protect 报告“此设备未经认证”。
  • 其他 SafetyNet / Play Integrity 相关问题。

1. 基本认识

[1] 什么是 Play Integrity?

Play Integrity 是一种 API,应用程序用来确定设备兼容性和安全状态。它在很大程度上取代了 SafetyNet,并设定了截止日期为 2025 年 1 月,届时 Google 的 SafetyNet 服务器将下线。一旦发生这种情况,继续仅依赖 SafetyNet 的应用程序将不再工作。大多数开发者已经迁移到 Play Integrity。

[2] Play Integrity 与 SafetyNet (SN) 有什么不同?

在很多方面,它非常相似。它使用了许多与 SafetyNet 相同的检查,但响应变得更简单了一些。

与 SafetyNet 类似,Play Integrity 允许应用开发者根据其对目标环境的要求选择分级执行策略。

[3] Play Integrity 和 Play Protect 是一样的吗?

不一样。Play Integrity 为用户提供了验证设备兼容性和安全性的功能,就像 SafetyNet 一样。Play Protect 是 Play 商店的一部分,确保您的设备经过认证,并帮助防止恶意软件。然而,Play Protect 认证结果确实取决于您的 DEVICE_INTEGRITY 结果。

注意:您的 Play Protect 认证可能会滞后于您的完整性判定。有可能即使您未通过 DEVICE_INTEGRITY,Play 商店仍然报告“设备已认证”,反之亦然 —— 即使您通过了,它也可能仍报告“未认证”。要解决这个问题,请清除 Play 商店数据。

[4] 为什么这很重要?

与 SafetyNet 类似,许多支付、银行和 DRM (数字版权管理) 应用程序使用此 API 来确定设备的兼容性和安全状态。未通过判定可能会限制您安装和使用这些应用程序的能力。

2. Play Integrity API 级别

MEETS_BASIC_INTEGRITY

  • 通过基本完整性检查。
  • 设备满足 Android 兼容性要求。
  • 可以运行 Google Play 服务。

MEETS_DEVICE_INTEGRITY

  • 通过系统完整性检查。
  • 通过 Google 认证(Certified)。
  • BL 锁定且无 Root。

MEETS_STRONG_INTEGRITY

  • 满足 DEVICE_INTEGRITY 的所有要求。

  • 具有硬件级别的安全保证(StrongBox 硬件支持 / 独立安全芯片)。

  • 支持硬件认证(Hardware-backed Attestation)。

  • 强启动完整性保证(如 Verified Boot)。

    说白了就是手机买回来后,正常使用。一旦 Root 了设备,很难达到这个级别。

MEETS_VIRTUAL_INTEGRITY (了解,模拟器才看这个)

  • 虚拟环境验证。确认设备不是模拟器(虚拟化环境中运行),是真实的物理设备。
级别BL 状态Root 状态ROM 类型硬件要求典型场景
BASIC可解锁可 Root可自定义无特殊要求玩机党、刷机用户
DEVICE🔒 必须锁定❌ 不能 Root官方 ROM通过认证普通用户、原厂系统
STRONG🔒 必须锁定❌ 不能 Root官方 ROM🔐 硬件安全模块高端旗舰、安全敏感场景
VIRTUALN/AN/AN/A虚拟环境开发者测试

更多参考:配置 API 响应

3. 如何知道我的设备是否通过了 Play Integrity 检查?

方法一:Play 商店

1️⃣ 点击右上角的个人资料图标,进入设置 ==> 关于 ==> 连续点击 8 次 Play 商店版本。这将解锁 Play 商店中的开发者模式。

2️⃣ 现在进入设置 ==> 常规 ==> 开发者选项 ==> 检查完整性。

方法二:应用程序

① Play Integrity API Checker【推荐】

Apps on Google Play

Apps on GitHub

② TB Checker - Play Integrity

此应用不仅检查 Play Integrity 判决,还检查 root、Magisk 和 Xposed 的痕迹。

Apps on Google Play

③ 密钥认证【推荐】

可查看密钥认证详情。

Apps on Google Play

Apps on GitHub

④ YASNAC - SafetyNet 检查器

Apps on Google Play

注意:谷歌关闭了 SafetyNet 服务器,此软件无法正常使用了。

二、TEE

TEE

TEE 是在主处理器上通过硬件隔离技术创建的一个安全的、隔离的执行环境,与普通操作系统 (Rich OS,如 Android) 并行运行。给数据和代码的执行提供一个更安全的空间,并保证它们的机密性和完整性。

keybox.xml

keybox.xml 存储在 persist 分区(物理存储),但密钥的加载、使用和保护是在 TEE 内完成的。

keybox.xml 的作用:

  • 包含设备的认证密钥。
  • 用于 Key Attestation(密钥认证)。

TEE 与 keybox 的关系:TEE 读取 keybox.xml,使用其中的密钥进行认证;TEE 保护密钥在内存中的使用。

三、KeyStore

KeyStore 是 Android 提供的安全密钥管理系统,用于存储和管理密码学密钥,提供高级别的安全保障。密钥保存在硬件安全模块 (HSM) 或可信执行环境 (TEE) 。举个安全支付应用使用 KeyStore 流程的例子:

  1. 用户首次设置
  • 用户安装支付应用并完成账户注册。
  • 应用要求用户设置支付 PIN 码或使用生物识别 (指纹 / 面容) 。
  • 在后台,应用使用 KeyStore 生成支付凭证密钥,并与用户生物识别绑定。
  • KeyStore 将密钥安全存储在 TEE / 安全硬件中。
  1. 日常使用场景
  • 用户打开支付应用并浏览商品。
  • 用户选择商品并点击"支付"按钮。
  • 应用显示支付确认界面并请求生物识别验证。
  • 用户提供 pin、指纹或面容识别。
  1. 安全验证过程
  • 生物识别通过后,应用请求访问 KeyStore 中的支付密钥。
  • KeyStore 验证用户身份后授予应用使用密钥的临时权限。
  • 应用使用密钥对交易数据进行签名 (在 TEE 内完成) 。
  • 签名后的交易数据安全发送到支付服务器。

四、Key Attestation

Key Attestation 是 Android 提供的一项安全验证机制,用于证明加密密钥是否真正在设备的安全硬件中生成和存储。

  1. 制造阶段(设备生产时)
    • 根证书预置:设备在制造过程中,Google 的 Hardware Attestation Root 证书被烧录到 TEE 中。
    • 设备证书生成:制造商为每台设备生成唯一的 attestation 密钥对。
    • 证书签名:制造商使用其中间证书对设备 attestation 密钥进行签名。
    • 安全存储:这些密钥和证书被安全存储在设备 keybox.xml 中,并保护在 TEE 内。
制造阶段(在工厂):

1. Google 预先生成证书体系
   ┌─────────────────────────────┐
   │ Google Hardware Root CA     │ ← 根证书(Google 持有)
   └──────────────┬──────────────┘
                  ↓ 签名
   ┌─────────────────────────────┐
   │ OEM Intermediate CA         │ ← 中间证书(如一加/小米)
   │ (Google 签发给制造商)        │
   └─────────────────────────────┘

2. 制造商在工厂为每台设备:
   ① 生成设备唯一的 Attestation Key Pair
      ├─ Private Key (RSA/EC)
      └─ Public Key

   ② 使用 OEM 中间证书签名
      ┌─────────────────────────────┐
      │ Device Attestation Cert     │
      │ Subject: Device-Specific ID │
      │ Public Key: [设备公钥]       │
      │ Issuer: OEM Intermediate CA │
      │ Signature: [OEM 中间证书签名]│
      └─────────────────────────────┘

   ③ 生成 keybox.xml
      <Keybox DeviceID="唯一设备ID">
        <Key algorithm="rsa">
          <PrivateKey>
            [Base64 编码的私钥]
          </PrivateKey>
          <CertificateChain>
            <!-- 设备证书 -->
            <Certificate>
              [Device Attestation Cert]
            </Certificate>
            <!-- OEM 中间证书 -->
            <Certificate>
              [OEM Intermediate Cert]
            </Certificate>
            <!-- 注意:不包含 Google 根证书 -->
          </CertificateChain>
        </Key>
      </Keybox>

   ④ 写入到 persist 分区
      fastboot flash persist persist.img
      └─ 包含 keybox.xml

   ⑤ 锁定写保护
      设置分区为只读
      防止后续修改

3. 质检验证
   ├─ 测试 Key Attestation 功能
   ├─ 验证证书链完整性
   └─ 确认与 Google 服务器通信正常

应用请求 Key Attestation(运行时)

  1. 应用生成挑战值:应用创建一个随机挑战值 (challenge) 。

  2. 密钥生成请求:应用请求 KeyStore 生成带 attestation 的密钥,并传入挑战值。

  3. 请求转发:KeyStore 将请求转发给 TEE。

  4. TEE 内部证书链形成

    1. 密钥生成:在 TEE 内部创建新的应用密钥对。
    2. 证书创建:使用设备 attestation 私钥创建一个新证书,包含:
      • 新生成密钥的公钥。
      • 密钥属性(用途、限制等)。
      • 设备状态信息(bootloader 状态等)。
      • 对挑战值的签名。
    3. 证书链构建:TEE 构建完整证书链,自下而上为:
      • 第一层:刚刚创建的应用密钥证书。
      • 第二层:设备 attestation 证书(制造时预置)。
      • 第三层:制造商中间证书。
      • 顶层:Google Hardware Attestation Root 证书。
    4. 返回结果:TEE 将完整证书链返回给应用(私钥保留在 TEE 中)。
  5. 证书验证(通常在服务器端)

    • 应用将证书链发送到后端服务器
    • 服务器从顶部开始验证整个链:
      1. 验证Google根证书的有效性
      2. 使用Google根证书验证制造商证书
      3. 使用制造商证书验证设备证书
      4. 使用设备证书验证应用密钥证书
      5. 验证挑战值是否正确签名
      6. 检查设备状态信息

第二章:一加设备密钥

一、设备密钥认证状态

1. 如何查看

一加手机拨号界面输入 *#899# ==> 手动测试 ==> 其他 ==> Key状态。

2. 各密钥的作用

Rpmb key (重放保护内存块密钥)

  • 作用: 保护手机存储芯片中的敏感数据
  • 用途: 防止数据被篡改或回滚攻击
  • 例子: 防止别人把你的系统降级到旧版本

SOTER key (腾讯安全密钥)

  • 作用: 腾讯开发的生物认证标准
  • 用途: 微信支付、QQ 的指纹认证
  • 例子: 微信转账用指纹确认
  • 失败影响: 微信可能无法用指纹支付

IFAA key (互联网金融身份认证密钥)

  • 作用: 中国互联网金融身份认证联盟标准
  • 用途: 支付宝、微信等的指纹/人脸支付
  • 例子: 用指纹确认支付宝付款

Crypto key (加密密钥)

  • 作用: 通用数据加密
  • 用途: 加密手机存储的文件、数据
  • 例子: 你的照片、文件被加密保护

WidevineL1 key (DRM L1级密钥)

  • 作用: 数字版权保护最高等级
  • 用途: 播放高清/4K付费视频
  • 例子: Netflix 1080P、Disney+ 4K
  • 不支持影响: 只能看标清,看不了高清

HDCP key (高清内容保护)

  • 作用: 防止高清视频被盗录
  • 用途: 通过 HDMI 输出保护的高清内容
  • 例子: 连接电视看 Netflix 高清

Attestation key (设备认证密钥)

  • 作用: 证明设备未被 Root/解锁
  • 用途: 银行 APP、支付 APP 的安全检测
  • 例子: 工商银行 APP 检测手机是否安全
  • 失败影响: 银行 APP 可能无法使用

FIDO key (快速身份验证密钥)

  • 作用: 国际标准的生物识别认证
  • 用途: 指纹、人脸登录网站/APP
  • 例子: 用指纹登录谷歌账号

PKI cert (公钥基础设施证书)

  • 作用: 证明设备身份的数字证书
  • 用途: 设备与服务器安全通信
  • 例子: 设备个体证书,类似于身份证。证明你的手机是正品,不是山寨

PKI Group cert (组证书)

  • 作用: 厂商批量设备的集体证书 (设备批次证书)
  • 用途: 同一批次设备的认证
  • 例子: 召回特定批次、区域限制

FIDO2 key (WebAuthn密钥)

  • 作用: 网页端无密码登录
  • 用途: 浏览器中用指纹/人脸登录
  • 例子: Chrome浏览器用指纹登录网站

RKP default (远程密钥配置-默认)

  • 作用: Google 远程下发密钥的系统
  • 用途: 动态更新设备安全密钥
  • 例子: Google 自动更新设备证书
  • 失败影响: 无法获取最新的安全密钥

RKP widevine (远程密钥配置-Widevine)

  • 作用: Widevine DRM 的远程密钥管理
  • 用途: 动态更新视频播放权限
  • 例子: Netflix 动态验证播放权限
  • 失败影响: 可能影响付费视频播放

StrongBox key (强盒密钥)

  • 作用: Android 9+ 的最高安全级别硬件密钥。用独立芯片存储最重要的密钥,即使手机被完全破解也无法获取。
  • 用途: 存储最敏感的加密密钥
  • 例子: 军事级别的密钥保护
密钥类型主要用途失败后果
支付类IFAA, SOTER, FIDO指纹支付可能失败
视频类Widevine, HDCP只能看标清
安全类Attestation, RKP银行APP可能拒绝
加密类Crypto, Rpmb数据安全降低

3. RKP

1)是什么

RKP 是 Google 在 Android 12+ 引入的云端动态分发密钥的系统,让设备可以通过网络获取安全密钥,而不是在出厂时一次性烧录。

特性传统证书 (PKI cert)RKP 密钥
烧录时机出厂时固定激活后动态获取
更新能力❌ 无法更新✅ 可定期更新
泄露处理❌ 无法撤销✅ 可远程撤销
有效期永久有效有时间限制
Root影响不受影响失败后无法获取
安全性较低较高
2)工作流程

传统方式(出厂烧录)

手机出厂时:
┌──────────────┐
│  工厂生产线  │
└──────┬───────┘
       │ 一次性烧录密钥

┌──────────────┐
│   你的手机   │
│  密钥: A123  │ ← 固定,无法更新
└──────────────┘

问题:
❌ 密钥一旦泄露,无法更换
❌ 新的安全标准出现,旧设备无法支持
❌ 工厂需要管理大量密钥,容易泄露

RKP 方式(云端动态分发)

手机出厂时:
┌──────────────┐
│  工厂生产线  │
└──────┬───────┘
       │ 只烧录"身份凭证"

┌──────────────┐
│   你的手机   │
│ 凭证: 有效   │ ← 初始状态
└──────────────┘

手机激活后:
┌──────────────┐
│   你的手机   │
└──────┬───────┘
       │ "我需要安全密钥"

┌──────────────┐
│ Google 云端  │
│  密钥服务器  │
└──────┬───────┘
       │ 远程下发新密钥

┌──────────────┐
│   你的手机   │
│ 密钥: B456   │ ← 动态获取
└──────────────┘

优势:
✅ 密钥可以定期更新
✅ 泄露后可以远程撤销
✅ 工厂无需管理敏感密钥
✅ 支持新的安全标准
3)密钥池

RKP 系统有不同的密钥池,RKP default 是默认的通用密钥池。

RKP Default 是什么?

  • Google 的云端密钥分发系统
  • 让设备可以动态获取和更新安全密钥
  • 替代传统的出厂固定密钥方式

工作原理

  1. 设备出厂时只有身份凭证
  2. 激活后向 Google 请求密钥
  3. Google 验证设备安全性
  4. 通过验证后下发密钥
  5. 密钥定期更新
RKP 密钥池分类:

1. RKP default (通用)
   └─ 用于: 设备认证、SafetyNet、一般安全功能

2. RKP widevine (专用)
   └─ 用于: Netflix、Disney+ 等 DRM 视频

3. RKP strongbox (高安全)
   └─ 用于: 军事级加密、企业安全

4. RKP vendor (厂商)
   └─ 用于: 小米/华为自己的安全功能
4)应用场景
场景 1: SafetyNet / Play Integrity API
你打开银行APP:

银行APP: "请证明你的设备安全"

手机: 使用 RKP 密钥生成证明

     {
       device: "官方设备",
       bootloader: "未解锁",
       system: "未Root",
       signature: "用RKP密钥签名"
     }

银行APP: "验证签名..."

       ✅ RKP 密钥有效 → 允许使用
       ❌ RKP 密钥失败 → "设备不安全"
场景 2: 设备认证 (Attestation)
你使用 Google Pay 支付:

Google Pay: "证明你是官方设备"

手机: 用 RKP 下发的 attestationKey 签名

    证明内容:
    - 我是正品 Pixel/小米手机
    - 系统未被篡改
    - Bootloader 未解锁

Google: 验证 RKP 签名 ✅

      允许支付
场景 3: 密钥过期场景
// 30天前
设备密钥有效期: 2024-11-27 到 2024-12-27
状态: ✅ 正常

// 今天 (2024-12-28)
设备密钥: 已过期
手机尝试: 向 Google 请求新密钥
Google 检测: ❌ 设备已被 Root
结果: 拒绝下发新密钥

影响:
- 银行APP: "设备不安全,无法使用"
- Google Pay: "无法添加银行卡"
- Netflix: 只能播放标清
5)常用命令

查看设备是否支持 RKP

bash
# 查看设备是否支持 RKP
getprop | grep -i rkp
getprop | grep -i remote

查看 RKP 证书状态(adb 方式)

bash
# 1. 连接手机到电脑
adb devices

# 2. 查看 RKP 密钥存储
adb shell ls -la /data/vendor/keymaster/

# 3. 检查 Keystore 中的 RKP 密钥
adb shell keystore_cli_v2 list

# 4. 查看具体的 RKP 证书链
adb shell dumpsys keystore | grep -i "rkp"

# 5. 检查 RKP 服务状态
adb shell dumpsys remote_provisioning

查看 RKP 证书状态(APP 方式)

下载: Google Play Store
搜索: "Key Attestation"

使用步骤:
1. 打开 APP
2. 点击 "Test Attestation"
3. 查看输出结果

如果显示:
✅ "RKP provisioned" → RKP 证书已下发
❌ "Factory provisioned" → 使用出厂证书
❌ "Attestation failed" → 证书问题

----------------------------------------------------

下载: Google Play / APKPure
功能: 查看设备硬件信息

查看路径:
打开APP → System → Security Info
查找: "Remote Key Provisioning"

----------------------------------------------------

下载: GitHub / XDA
功能: 检查 SafetyNet 和证书

使用:
1. 打开 APP
2. 点击 "RUN ATTESTATION"
3. 查看 "Certificate Chain" 部分

如果显示 "Google Hardware Attestation":
→ 说明使用了 RKP 证书

查看 RKP 证书状态(判断指南)

✅ RKP 证书已下发的特征
1. 证书链显示:
   - 根证书颁发者: "Google Hardware Attestation Root"
   - 中间证书: "Google Hardware Attestation Intermediate"

2. Logcat 显示:
   - "Successfully provisioned"
   - "Remote key available"

3. Key Attestation 结果:
   - Attestation Security Level: TRUSTED_ENVIRONMENT
   - Key Origin: GENERATED
   - Attestation Application ID: 有 Google 签名

❌ 使用出厂证书的特征
1. 证书链显示:
   - 根证书颁发者: 厂商名称 (如 "Xiaomi TEE")
   - 或: "StrongBox Root"

2. Logcat 显示:
   - "Using factory provisioned keys"
   - "Remote provisioning not available"

3. Key Attestation 结果:
   - 没有 Google 签名
   - 证书链较短
preview
图片加载中
预览

Released under the MIT License.