希望能盡量防止別人 反編譯你的代碼:
目前蘋果審核規則可知,蘋果官方是不希望你使用代碼混淆的。。。如果發現了你用代碼混淆,甚至會勒令你修改你的代碼,否則下一次審核會直接移除你的app…尤其是跑腳本的那種。我猜想 ,目的是防止馬甲包泛濫,並且蘋果不希望你有所隱瞞。。。所以代碼要請清清白白
參考審核規則
Guideline 2.3.1 - Performance
We discovered that your app contains hidden features. Specifically, It would be appropriate to remove all code obfuscation and selector mangling or to explain in detail the purpose of its inclusion before resubmitting for review.
那么,我們想提高一些代碼的安全性,還有哪些手段措施:
1. 數據加密:
1.本地數據數據加密:
(1)NSUserDefaults 里關鍵數據加密 : eg base64 再存儲
(2)Sqlite 數據庫存儲數據加密 :eg realm 使用 AES-256 對稱加密。每次創建新的 Realm 實例的時候,都需要提供相同的密鑰。
(可以把密鑰存在鑰匙串里)
(3)網絡傳輸數據加密:可以使用RSA非對稱加密,保證傳輸的數據安全,防止代理抓包,偽造https證書抓包
2. 代碼混淆 是增加破解難度,不是完全不能破解
(1)字符串混淆 (方法名混淆) :可讀性降低 ,部分敏感字符串混淆
(2)邏輯混淆 :邏輯混亂,降低可讀性
(3) 指定敏感業務邏輯代碼局部C 重寫:把函數名隱藏在結構體里,以函數指針成員的形式存儲。這樣做的好處是,編譯后,只留了下地址,去掉了名字和參數表,提高了逆向成本和攻擊門檻。
(4) 垃圾代碼生成:容易造成冗余代碼,降級可讀性
Tips:(1)混淆只是增加了別人的攻破時間成本。實際別人多花點時間 肯定是能攻破的
(2)代碼混淆,如果針對應用整體,工作量大,操作耗時。一般都是針對業務敏感的關鍵代碼進行混淆,輕量,好維護
(3)在 (2)的基礎上,混淆的結果是毫無意思的字符串,蘋果也是容易被拒絕的。所以混淆結果是跟功能,變量意義完全沒關系的名稱,即可。
eg:
如你的功能名是 - (void)addMessageCount。 你可以換成- (void)newErZi
newErZi 這種跟功能就完全沒關系的名稱。 並且也不是那種無意義的字符串 (參考8 中的混淆思路特別好,混淆的是一些單詞)
混淆代碼的本質是增加了別人的攻破時間成本。實際別人多花點時間 肯定是能攻破的。
3.核心代碼封裝成庫(這里指的是靜態庫framework 非開源 即閉源庫),核心功能做邏輯混淆
參考
- 1.https://www.jianshu.com/p/d9cd97c77549
- 2.http://www.cocoachina.com/ios/20170324/18955.html
- 3.https://www.jianshu.com/p/a2ed798a7f62?from=timeline
- 4.https://blog.csdn.net/yiyaaixuexi/article/details/29210413 iOS安全攻防(二十四):敏感邏輯的保護方案(1)
- 5.https://blog.csdn.net/yiyaaixuexi/article/details/29201699 iOS安全攻防(二十三):Objective-C代碼混淆
- 6.https://github.com/guogh/iOSApplicationReinforcement/issues/3
- 7 . https://github.com/LarkNan/TestConfusion/issues
- 8.https://github.com/TMWu/TMConfuse (由於上架過程中混淆詞匯中存在敏感詞匯,被蘋果爸爸拒了一次,所以修改隨機單詞拼接規則,由通用的單詞拼接,可以自行修改)
- 9.https://www.jianshu.com/p/ca2f329254e8 (iOS 相關庫知識)