Android本地解密Google Play Integrity响应遇BAD_DECRYPT异常求助
Google Play Integrity本地解码抛出AEADBadTagException异常的原因分析
以下是导致该异常的常见原因及排查方向:
1. Base64解码模式不匹配
Play Console提供的解密密钥和验证密钥采用URL安全的Base64编码(用-、_替代标准Base64的+、/),而你的代码中使用Base64.DEFAULT解码,会导致密钥字节数组解析错误,最终触发解密失败。服务器端大概率使用了正确的URL安全解码模式,因此能正常工作。
建议修改Base64解码参数:
val decryptionKeyBytes: ByteArray = Base64.decode(base64OfEncodedDecryptionKey, Base64.URL_SAFE or Base64.NO_WRAP) val encodedVerificationKey: ByteArray = Base64.decode(base64OfEncodedVerificationKey, Base64.URL_SAFE or Base64.NO_WRAP)
2. Nonce生成/传递不一致
请求Integrity Token时传入的nonce必须满足:
- 原始数据长度为16-32字节,再经过Base64编码
- 本地生成的nonce与服务器端验证用的nonce完全一致(包括编码方式、无额外空格/换行)
如果本地nonce生成不符合规范,会导致返回的token无法被正确解密。
3. 密钥配置错误
- 确认本地使用的解密密钥是Play Console中下载的对称密钥(用于JWE解密),而非验证用的EC公钥
- 检查密钥字符串是否完整复制,无多余空格、换行符或截断
4. 依赖库版本差异
服务器端与Android端使用的jose4j库版本不一致,可能导致AES-GCM加密算法的实现细节差异,触发解密失败。确保两端使用相同版本的jose4j库。
5. Android系统加密环境限制
部分旧Android版本(API < 23)对AES-GCM的支持存在兼容性问题,或者AsyncTask线程环境下加密操作受到系统权限/库的限制。可以尝试将解密操作移至普通线程,或者在更高版本的Android设备上测试。
内容的提问来源于stack exchange,提问作者rysv
相关产品推荐
相关产品推荐

