首页
社区
课程
招聘
[原创]谷歌完整验证Play Integrity Check全面分析
发表于: 2025-9-30 17:23 7593

[原创]谷歌完整验证Play Integrity Check全面分析

2025-9-30 17:23
7593


引言


在海外安卓APP市场,Google Play Integrity API是风控策略的最重要一环。大部分APP风控系统均依赖于这个体系,Play Integrity Check不是一个简单的设备检查,而是一套精密的远程安全证明(Remote Key Attestation) 系统



Play Integrity API 的响应结构(Integrity Verdict)本身就是其技术理念的体现——分层判决。它不是给出一个单一结论,而是提供一组信号,由开发者服务器基于自身风险模型进行最终决策。


技术原理: 其核心依赖于一个由Google硬件根密钥签名的认证链。整个过程可分解为:


应用向设备上的Play服务发起请求,附带一个由服务器生成的、一次性的随机数("nonce")或哈希("requestHash")。此步骤用于防止重放攻击。


 Play服务作为可信执行环境(TEE)或StrongBox的调用代理,收集设备硬件、系统状态、应用身份等多种信号。这些信号与"nonce"一起,由一个受硬件保护的密钥进行签名,生成一个完整性令牌(Integrity Token)。



验证通过后,服务器解码令牌中的JSON载荷,并根据其中各个字段的信号进行综合风控判决。


{

  "requestDetails": { ... },

  "appIntegrity": { ... },

  "deviceIntegrity": { ... },

  "accountDetails": { ... },

  "environmentDetails": { ... }

}

"requestDetails": {

  // 代码包名

  "requestPackageName": "com.package.name",

  // 请求哈希

  "requestHash": "aGVsbG8gd29scmQgdGhlcmU",

  // 时间戳

  "timestampMillis": "1675655009345"

}

技术原理: 这是所有验证的第一道关卡。服务器必须严格比对

"requestPackageName"和

"requestHash"/

"nonce"是否与原始请求一致。


风控意义: 确保返回的判决结果确实是对本次特定请求的响应,有效抵御攻击者截获并重复使用旧令牌的重放攻击(Replay Attack)。



* 技术原理: 此字段直接验证应用本身的二进制身份。

"appRecognitionVerdict"的取值源于与Google Play服务器上的官方记录进行比对。


  "PLAY_RECOGNIZED":应用的证书SHA256摘要、包名和版本号与Play商店中最新或允许的版本完全匹配。这证明了应用未被篡改、重打包或替换签名。


   "UNRECOGNIZED_VERSION":证书或包名可能有效,但版本不符(如安装的是非官方渠道的修改版)。


风控意义: 这是对抗重打包应用(Repackaged App) 和木马植入的第一道防线。对于金融、支付等核心场景,应强制要求"PLAY_RECOGNIZED"。


"deviceIntegrity": {

  // "MEETS_DEVICE_INTEGRITY" is one of several possible values.

  "deviceRecognitionVerdict":   ["MEETS_DEVICE_INTEGRITY"]

}

这是最复杂且最核心的部分,采用了一种标签化(Label-based) 的信任模型。


技术原理: 系统通过多个维度评估设备环境:

硬件支持验证: 检查是否具备硬件支持的密钥认证(如TEE),"verifiedBootState"是否为"Verified","deviceLocked"是否为

"true"。这是"MEETS_DEVICE_INTEGRITY"的基础。


模拟器检测: 纯软件模拟器通常无法通过硬件验证,因此无法获得"MEETS_DEVICE_INTEGRITY"标签。"MEETS_VIRTUAL_INTEGRITY"则为Google认可的安全模拟器提供了出路。


标签体系解析:

"MEETS_BASIC_INTEGRITY":最低限度信任。 设备可能已解锁Bootloader或系统未认证,但系统内核未被严重破坏(无Root)。可用于过滤掉最粗糙的篡改。

重点参考:KeyAttestion验证是否为合法谷歌颁发证书,且未吊销。非模拟器设备,ROM为经过谷歌GMS认证的设备系统。(主要通过Build信息和系统签名来判断)

参考意义:依据谷歌的说法,如果获得此项检测,则至少说明设备应该获取到GMS验证


"MEETS_DEVICE_INTEGRITY":核心信任等级。 意味着设备是正版硬件,引导加载程序已锁定,运行的是经过认证的系统映像。这是绝大多数安全操作的必要条件。

重点参考:证书的rootOfTrust结构,确保该设备BL未被解锁


"MEETS_STRONG_INTEGRITY":最高信任等级。 在"MEETS_DEVICE_INTEGRITY"基础上,还要求系统在过去一年内接收过安全更新。这旨在排除那些长期不更新、存在已知漏洞的设备。

重点参考:Build.SECURITY_PATCH,证书里面的补丁版本信息



传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2025-9-30 18:36 被恋空编辑 ,原因: 1
收藏
免费 24
支持
分享
最新回复 (27)
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
第一
2025-9-30 17:26
0
雪    币: 20
活跃值: (1281)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
tql
2025-9-30 17:31
0
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2025-9-30 18:38
0
雪    币: 132
活跃值: (6362)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
keybox是个问题
2025-9-30 18:43
0
雪    币: 32
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
大佬,我有个问题,我想做一个pdd的环境包,请问谷歌3的话这种对应表应该怎么弄呢,有偿有偿师傅。
2025-10-1 10:58
0
雪    币: 294
活跃值: (665)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
666
2025-10-2 13:50
0
雪    币: 4149
活跃值: (6964)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
有没有可能,A设备是风险的,B设备是正常的,把验证的工作转移给B去做
2025-10-5 04:43
0
雪    币: 814
活跃值: (3635)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
KerryS 有没有可能,A设备是风险的,B设备是正常的,把验证的工作转移给B去做

理论上是不行的。因为,KeyAttestion每次生成出来的验证证书,包含了调用者的包名和签名SHA256(且这个过程执行在系统keystore2进程内)。在正常未解锁设备下,你既无法伪造出应用签名,也无法hook或者篡改系统代码。所以,你还是无法绕过。
详细字段参考:5faK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3X3g2S2L8X3c8J5L8$3W2V1i4K6u0W2j5$3!0E0i4K6u0r3M7s2u0A6N6X3q4U0P5g2)9J5k6r3q4F1k6q4)9J5k6s2y4W2j5%4g2J5K9i4c8&6i4K6u0r3M7$3g2U0N6i4u0A6N6s2W2Q4x3X3c8C8k6i4W2Q4x3X3c8S2N6s2c8W2M7%4c8S2N6r3W2G2L8W2)9K6c8X3S2D9i4K6y4p5P5X3S2Q4x3X3c8U0L8R3`.`.
字段名称:AttestationApplicationId


例外:

除非你有办法在未解锁bl的情况下,攻击系统拿到权限,或者hook系统代码。

并且,证书内包含了系统补丁日期,谷歌对这种有漏洞的设备版本比较敏感。(懂得都懂

最后于 2025-10-7 16:02 被恋空编辑 ,原因:
2025-10-7 15:58
0
雪    币: 53
活跃值: (211)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
666
2025-10-7 16:45
0
雪    币: 4149
活跃值: (6964)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
恋空 KerryS 有没有可能,A设备是风险的,B设备是正常的,把验证的工作转移给B去做 理论上是不行的。因为,KeyAttestio ...
AB两个设备都安装同一个app,同一版本,这样的话,调用者的包名和签名,岂不是都是一样的了吗
2025-10-8 04:55
0
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
tql
2025-10-9 16:46
0
雪    币: 814
活跃值: (3635)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
KerryS AB两个设备都安装同一个app,同一版本,这样的话,调用者的包名和签名,岂不是都是一样的了吗
你教教我怎么在未解锁未root的情况下,拿到别的应用的证书数据?你是神偷吗?
2025-10-9 17:53
1
雪    币: 1
活跃值: (1000)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
6
2025-10-10 14:14
0
雪    币: 6
活跃值: (2245)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
666
2025-10-12 09:50
0
雪    币: 0
活跃值: (25)
能力值: (RANK:0 )
在线值:
发帖
回帖
粉丝
16
感谢分享1
2025-10-13 10:21
0
雪    币: 0
活跃值: (25)
能力值: (RANK:0 )
在线值:
发帖
回帖
粉丝
17
感谢分享2
2025-10-13 10:21
0
雪    币: 624
活跃值: (5258)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
18
这种证书链,,咋分析。。在bootloader上的
2025-10-13 10:58
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19
6666661
2025-10-13 13:42
0
雪    币: 0
活跃值: (25)
能力值: (RANK:0 )
在线值:
发帖
回帖
粉丝
20
6666664
2025-10-13 14:15
0
雪    币: 0
活跃值: (25)
能力值: (RANK:0 )
在线值:
发帖
回帖
粉丝
21
感谢博主分享,受益颇丰
2025-10-13 15:42
0
雪    币: 8
活跃值: (20)
能力值: (RANK:0 )
在线值:
发帖
回帖
粉丝
22
好文章,打开新思路
2025-10-16 10:45
0
雪    币: 242
活跃值: (2824)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
23
大佬有研究过 TrickyStore的检测不?
2025-10-16 16:07
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
恋空 你教教我怎么在未解锁未root的情况下,拿到别的应用的证书数据?你是神偷吗?
那么问题来了,你怎么知道他不是神偷!!!
2025-10-22 05:30
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25
大佬,能加个好友吗,私信下我,我账号没权限私信
2025-10-24 15:15
0
游客
登录 | 注册 方可回帖
返回