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后被蘋果刪除,因為該文件中包含了證書相關(guān)信息,ipa包上傳到appstore后,蘋果會驗證證書的合法性,驗證通過后會刪除該文件,并對ipa包進(jìn)行重簽后上架appstore,這樣才能保證開發(fā)者自己的證書過期后依然可以通過appstore進(jìn)行下載。

但是如果ipa包被越獄手機(jī)二次簽名后,embeded.mobileprovision文件會重新生成,這時則可以監(jiān)測到文件是否被篡改來判斷是否被二次簽名。

2、判斷embeded.mobileprovision是否存在

基于上述原理,線上包是不存在embeded.mobileprovision這個文件的,如果是上架appstore的包,則可以通過判斷embeded.mobileprovision是否存在則可以判斷是否被二次打包。

3、其他方案

還有一些網(wǎng)上搜索到的方案,我沒有驗證過

通過判斷info.plist中是否存在SignerIdentity

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

通過對重要文件的hash值進(jìn)行校驗

可以在app中重要文件的hash值存儲到服務(wù)器,在app啟動是計算重要文件的hash值與服務(wù)器進(jìn)行對比。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容