设备过环境
第一章:常见名词
一、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 | 🔐 硬件安全模块 | 高端旗舰、安全敏感场景 |
| VIRTUAL | N/A | N/A | N/A | 虚拟环境 | 开发者测试 |
更多参考:配置 API 响应
3. 如何知道我的设备是否通过了 Play Integrity 检查?
方法一:Play 商店
1️⃣ 点击右上角的个人资料图标,进入设置 ==> 关于 ==> 连续点击 8 次 Play 商店版本。这将解锁 Play 商店中的开发者模式。
2️⃣ 现在进入设置 ==> 常规 ==> 开发者选项 ==> 检查完整性。
方法二:应用程序
① Play Integrity API Checker【推荐】
② TB Checker - Play Integrity
此应用不仅检查 Play Integrity 判决,还检查 root、Magisk 和 Xposed 的痕迹。
③ 密钥认证【推荐】
可查看密钥认证详情。
④ YASNAC - SafetyNet 检查器
注意:谷歌关闭了 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 流程的例子:
- 用户首次设置
- 用户安装支付应用并完成账户注册。
- 应用要求用户设置支付 PIN 码或使用生物识别 (指纹 / 面容) 。
- 在后台,应用使用 KeyStore 生成支付凭证密钥,并与用户生物识别绑定。
- KeyStore 将密钥安全存储在 TEE / 安全硬件中。
- 日常使用场景
- 用户打开支付应用并浏览商品。
- 用户选择商品并点击"支付"按钮。
- 应用显示支付确认界面并请求生物识别验证。
- 用户提供 pin、指纹或面容识别。
- 安全验证过程
- 生物识别通过后,应用请求访问 KeyStore 中的支付密钥。
- KeyStore 验证用户身份后授予应用使用密钥的临时权限。
- 应用使用密钥对交易数据进行签名 (在 TEE 内完成) 。
- 签名后的交易数据安全发送到支付服务器。
四、Key Attestation
Key Attestation 是 Android 提供的一项安全验证机制,用于证明加密密钥是否真正在设备的安全硬件中生成和存储。
- 制造阶段(设备生产时)
- 根证书预置:设备在制造过程中,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(运行时)
应用生成挑战值:应用创建一个随机挑战值 (challenge) 。
密钥生成请求:应用请求 KeyStore 生成带 attestation 的密钥,并传入挑战值。
请求转发:KeyStore 将请求转发给 TEE。
TEE 内部证书链形成
- 密钥生成:在 TEE 内部创建新的应用密钥对。
- 证书创建:使用设备 attestation 私钥创建一个新证书,包含:
- 新生成密钥的公钥。
- 密钥属性(用途、限制等)。
- 设备状态信息(bootloader 状态等)。
- 对挑战值的签名。
- 证书链构建:TEE 构建完整证书链,自下而上为:
- 第一层:刚刚创建的应用密钥证书。
- 第二层:设备 attestation 证书(制造时预置)。
- 第三层:制造商中间证书。
- 顶层:Google Hardware Attestation Root 证书。
- 返回结果:TEE 将完整证书链返回给应用(私钥保留在 TEE 中)。
证书验证(通常在服务器端)
- 应用将证书链发送到后端服务器
- 服务器从顶部开始验证整个链:
- 验证Google根证书的有效性
- 使用Google根证书验证制造商证书
- 使用制造商证书验证设备证书
- 使用设备证书验证应用密钥证书
- 验证挑战值是否正确签名
- 检查设备状态信息
第二章:一加设备密钥
一、设备密钥认证状态
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 的云端密钥分发系统
- 让设备可以动态获取和更新安全密钥
- 替代传统的出厂固定密钥方式
工作原理
- 设备出厂时只有身份凭证
- 激活后向 Google 请求密钥
- Google 验证设备安全性
- 通过验证后下发密钥
- 密钥定期更新
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
# 查看设备是否支持 RKP
getprop | grep -i rkp
getprop | grep -i remote查看 RKP 证书状态(adb 方式)
# 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 签名
- 证书链较短