基于RMStore的旧Objective-C应用适配Apple SHA-256收据验证问题
解决RMStore本地收据验证从SHA1切换到SHA256的问题
直接替换哈希算法为SHA256不生效的原因是除了算法本身,还需要调整哈希长度、适配新的签名证书,同时兼容新旧收据格式,具体修改点如下:
1. 调整哈希数据长度
SHA1哈希长度为20字节,SHA256为32字节,需同步修改expectedHash的初始化代码:
原代码:
NSMutableData* expectedHash = [NSMutableData dataWithLength:CC_SHA1_DIGEST_LENGTH]; SHA1((const uint8_t*)data.bytes, data.length, (uint8_t*)expectedHash.mutableBytes);
修改为:
NSMutableData* expectedHash = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH]; SHA256((const uint8_t*)data.bytes, data.length, (uint8_t*)expectedHash.mutableBytes);
2. 更新证书验证逻辑
Apple当前使用Apple Root CA - G3证书签名SHA256格式的收据,需确保RMStore的证书信任链包含该根证书:
- 找到RMStore中存储根证书的文件(如
RMAppReceiptSecurity.m),替换旧的Apple根证书内容为G3证书的DER格式数据。 - 验证签名时,使用
kSecKeyAlgorithmRSASignatureDigestSHA256算法,替换原SHA1对应的签名算法。
3. 兼容新旧收据格式
为同时支持旧的SHA1签名收据和新的SHA256签名收据,需在验证逻辑中添加分支处理:
- 优先尝试SHA256算法验证,若失败则回退到SHA1算法(直到所有旧收据完成更新)。
4. 测试验证
- 在Sandbox环境下,调用
SKReceiptRefreshRequest强制刷新应用收据,获取新的SHA256签名收据。 - 用修改后的代码验证,确保哈希匹配、证书验证通过。
- 同时测试未刷新的旧收据,确认其仍能通过SHA1分支的验证。
关键注意事项
- 必须在2023年8月14日前完成修改,否则生产环境的新收据会验证失败。
- 确保项目已引入
CommonCrypto框架,SHA256函数依赖该框架运行。
内容的提问来源于stack exchange,提问作者mota
相关产品推荐
相关产品推荐

