iOS 防止ipa包重签名后二次打包

1、通过embeded.mobileprovision验证

       if let embeddedPath = Bundle.main.path(forResource: "_CodeSignature/CodeResources", ofType: ""),
           let dic = NSMutableDictionary.init(contentsOfFile: embeddedPath),let files = dic["files"] as? [String:Any],let hashData = files["embedded.mobileprovision"] as? Data{
              let hashValue = hashData.base64EncodedString()
              let localHashValue = getHashValue()
              if hashValue != localHashValue{//文件被篡改,退出
                  Toast.showInfo(content: "检测到非法签名,程序即将退出",duration: 3)
                  DispatchQueue.main.asyncAfter(deadline: .now()+3) {
                    exit(0) // (1)
              }
            }
        }

embeded.mobileprovision文件会在上架appStore后被苹果删除,因为该文件中包含了证书相关信息,ipa包上传到appstore后,苹果会验证证书的合法性,验证通过后会删除该文件,并对ipa包进行重签后上架appstore,这样才能保证开发者自己的证书过期后依然可以通过appstore进行下载。

但是如果ipa包被越狱手机二次签名后,embeded.mobileprovision文件会重新生成,这时则可以监测到文件是否被篡改来判断是否被二次签名。

2、判断embeded.mobileprovision是否存在

基于上述原理,线上包是不存在embeded.mobileprovision这个文件的,如果是上架appstore的包,则可以通过判断embeded.mobileprovision是否存在则可以判断是否被二次打包。

3、其他方案

还有一些网上搜索到的方案,我没有验证过

通过判断info.plist中是否存在SignerIdentity

NSBundle *bundle = [NSBundle mainBundle]; 
NSDictionary *info = [bundle infoDictionary]; 
if ([info objectForKey: @"SignerIdentity"] != nil) 
{
     return YES;
}
return NO;

通过对重要文件的hash值进行校验

可以在app中重要文件的hash值存储到服务器,在app启动是计算重要文件的hash值与服务器进行对比。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容