Android使用RSA OAEP解密时MGF1不支持SHA-256摘要如何解决?
Android RSA/ECB/OAEPWithSHA-256AndMGF1Padding 适配问题解答
1. 限制存在的原因
- 该限制属于Android Keystore系统的硬编码逻辑,根源是早期Android加密实现和TEE(可信执行环境)硬件能力绑定:早期绝大多数安卓设备的TEE厂商固件仅实现了MGF1摘要搭配SHA-1的OAEP填充方案,谷歌为了保证加密能力在全机型的兼容性,统一限制了Keystore的RSA-OAEP的MGF1仅支持SHA-1。
- 早期Android加密框架迭代较慢,RSA-OAEP搭配SHA-256的相关标准普及晚于Keystore核心功能定稿,旧版本系统不会新增该类非安全补丁类的特性。
2. 后续版本调整情况
- Android 13(API Level 33)及以上版本已经正式支持
MGF1ParameterSpec.SHA256参数,该限制已被移除。 - 低于API 33的系统版本不会再调整该限制,谷歌对旧版本系统仅推送安全漏洞补丁,不会新增加密算法支持类的功能更新。
3. 可行的绕过方案
- 方案一:密钥无需存储在Keystore的场景下,指定使用第三方加密提供器初始化Cipher,不走系统Keystore的实现。推荐使用SpongyCastle(Android适配版BouncyCastle),初始化代码修改为
Cipher.getInstance(transformation, "SC"),将SpongyCastle打包进APK即可不受系统限制。注意该方案的加密运算运行在Android用户态内存中,相比Keystore的TEE级安全等级更低,敏感密钥需做好内存防护。 - 方案二:必须使用Keystore存储密钥的场景下,可和对端协商调整加密参数:OAEP主哈希保留SHA-256,仅将MGF1的摘要算法改为SHA-1,该组合可兼容所有版本的Android Keystore,且安全强度下降极微,可满足绝大多数业务的安全要求。
- 方案三:仅面向高版本用户的场景下,可做版本适配:API 33及以上使用SHA-256的MGF1参数,低于33的版本走上述两个兼容方案即可。
内容的提问来源于stack exchange,提问作者mahler
相关产品推荐
相关产品推荐

