本地解密验证Play Integrity API Token遇标签不匹配错误求助
Play Integrity API本地解密遇Tag mismatch的排查方案
踩过的坑和解决办法
1. Base64解码用错了
Google提供的解密密钥是URL安全的Base64编码,和标准Base64格式不同(用-、_替代+、/,可能无末尾=填充符)。如果用普通Base64.decode解码,会导致密钥字节错误,直接触发Tag mismatch。
修正代码:
// 替换为URL安全的Base64解码器 byte[] decryptionBytes = Base64.getUrlDecoder().decode(base64OfEncodedDecryptionKey);
2. 密钥长度不匹配
Play Integrity的本地解密密钥必须是256位(即32字节)。解码后先检查字节数组长度:
System.out.println(decryptionBytes.length); // 必须输出32,否则密钥无效或解码错误
若长度不对,要么是复制密钥时遗漏字符,要么是解码方式错误,需重新从Play Console下载密钥并完整复制。
3. 测试/生产环境混用
测试环境生成的token(比如用FakeIntegrityManager生成的测试token)必须用测试密钥解密,生产环境token必须用生产密钥解密,混用必然触发Tag mismatch。
4. 密钥类型搞反了
Play Integrity的JWE固定使用:
- 密钥加密算法:
RSA-OAEP-256 - 内容加密算法:
A256GCM
如果你的密钥是服务账号的RSA私钥(而非AES密钥),之前的AES密钥写法完全错误,需改为RSA私钥解密:
// 从服务账号JSON文件加载RSA私钥,加载逻辑自行补充 PrivateKey privateKey = ...; JsonWebEncryption jwe = (JsonWebEncryption) JsonWebStructure.fromCompactSerialization(playIntegrityToken); jwe.setKey(privateKey); System.out.println(jwe.getPayload());
5. Token完整性问题
确保token在传输过程中未被截断或篡改,JWE格式应为5段Base64字符串用.分隔,可先打印playIntegrityToken确认格式完整。
快速验证步骤
- 检查解码后密钥长度:AES密钥为32字节,RSA私钥需符合对应格式
- 强制使用URL安全Base64解码密钥
- 确认token与密钥的环境一致(测试/生产)
- 打印JWE头确认算法:
System.out.println(jwe.getHeader().getAlgorithm()); System.out.println(jwe.getHeader().getEncryptionMethod());
正常输出应为RSA-OAEP-256和A256GCM,再对应选择密钥类型即可。
内容的提问来源于stack exchange,提问作者Israel landeros Beltrán Eliot
相关产品推荐
相关产品推荐

