1、ipa包加殼
首先,我們可以通過iTunes 下載 AppStore的ipa文件(蘋果 把開發者上傳的ipa包 進行了加殼再放到AppStore中),所以我們從AppStore下載的ipa都是加殼的,所以不能直接用來反編譯。
得到ipa文件 可以分析APP 里包含的一些資源,如:圖片、plist文件、靜態wap頁、.bundle 等。
所以不要 在plist文件、項目中的靜態文件中 存儲關鍵的信息,如果要保存,記得 對稱加密(這樣可以增加破解的難度)。
如果是越獄的手機,從 手機上的PP助手下載的ipa包 都是 脫殼之后的,可以直接用來反編譯。
我們可以用軟件 查看 APP的沙盒,查看里面存儲的 文件:sqlite、plist(NSUserdefault會存到Library下的Preferences中 的 plist文件中)、圖片等,NSUserdefault 中不要保存關鍵信息,如果要保存,還是加密吧。。sqlite也是這樣子的。
iOS 8.3之前 不越獄的手機也可以 直接用MAC上的PP助手、iTool 來查看 任何APP的沙盒(系統APP除外)。iOS 8.3之后就不行了。
越獄手機都可以查看任意APP的沙盒,包括系統APP的沙盒。還有iOS的系統目錄等。
越獄手機直接用PP助手下載的就是 脫殼的ipa,所以不用再脫了。對AppStore下載的ipa包 可以用工具對加殼的ipa 進行脫殼,再用IDA、Hopper 進行反編譯,進行分析 ,可以得到 近乎易懂的 偽代碼。但是反編譯后的代碼 要 一個方法一個方法的去分析,類似面向過程編程。。當然也有工具 去提取 項目中的所有.h文件。不過 反編譯 終歸是個 耐心的活,急躁的人容易砸電腦。
所有的APP都是可以反編譯的,所以 很關鍵的數據 最好通過接口獲取。
那么接口如何保證安全呢。首先用HTTPS,雖然HTTPS已經很安全了,但是數據也是有可能被破解的,這個后面會介紹。。所以 接口一定要自己加密。
非對稱加密(RSA)現在 還是沒有辦法破解的,但是因為 非對稱加密的效率低,所以很少有企業將所有的接口都用非對稱加密。
接口如果用對稱加密,密鑰 放到代碼里 是能被反編譯出來的。如果你的 APP的安全性很高,就不要把密鑰 寫到代碼里。
可以這樣處理:
先通過非對稱加密的接口 獲取密鑰,然后 再在 后面的 接口通信中 用這個密鑰進行加密。這樣做 就類似 HTTPS 的簡化版實現了。安全性很高。目前應該 是不能破解的。
根據APP的安全性,也可以把 關鍵數據 寫在代碼里,可以保存的是加密后的數據。比如,我給一個變量賦值:U2FsdGVkX1+rN+sgpLmOYTqoVhRRerZj9oobZAIPzjo=,你不知道 我這個字符串解密后是 123456,我只是使用的時候才解密處理用。
這樣也只是增加了黑客獲取關鍵數據的難度。
密鑰要定期更換。比如 3個月 或半年換一次,如果密鑰是從接口通過非對稱加密 獲取的,直接修改服務端就可以了。
如果密鑰是寫在代碼里的。就等APP升級新的版本的時候,新版本的APP和其對應的接口版本 都 修改為新的密鑰 就可以了。
舊的接口版本和APP版本還用以前的密鑰,等強制更新的時候才會失效。
如果一個APP 一個密鑰用上幾年都不變 ,是很危險的。離職的人員都可以直接用以前 的代碼 來獲取相關的數據。特別是 支付相關的,有的服務端甚至沒有 去校驗支付的金額或其他數據,導致 離職人員用1分錢 可以買到 任何價格的 線上產品(服務端這種在線上環境留后門的安全性問題,我是真的遇到有人這么搞)。。
最好能 進行 代碼混淆,能增加反編譯的難度,當然只是增加了難度,還是能破解的。但是 代碼混淆 的 性價比是很高的,就是你這邊付出了 一點時間,而黑客 就要多付出幾十倍 的時間。。其實 接口 自己加密 的性價比也很高。
接口返回的數據 最好也進行 加密。比如,現在大家都連我的熱點,或者代理服務器,我是有可能 直接 獲取你的APP的 HTTPS 解密后的json數據(如何獲取相見《逆向工程》)。當然,如果你覺得 你的APP返回的json數據都是 不重要的,也可以不對數據進行加密。
像微信、QQ、支付寶這種 安全性高的,通信兩邊的數據 收發 都 應該 進行加密的。
像HTTPS本身 是否有漏洞這種我們就不去說了。就 去年iOS的AFNetworking 漏洞事件,完全是 代碼的問題。雖然不是HTTPS的安全機制的問題。但是 黑客還是能很容易拿到HTTPS解密后的數據。
去年iOS的AFNetworking曝SSL漏洞 就涉及2.5萬個APP。 有的銀行的APP,只用了HTTPS,通信都不加密,就很容易拿到明文數據了。有的APP里的各種數據都 采用復雜的加密算法,破解人員看到都煩,去破解這個APP的時間還不如去搞其他的幾個APP。
HTTPS 本身是安全的。但是數據還是可能被破解。所以 不要覺得 我只用HTTPS 就安全了。理論上 說任何 的 協議、代碼都是可能有漏洞的,只是有的現在 還沒被發現或破解,並不代表一直不能被破解。。
10、敏感信息安全加密
黑客不會 去一個手機一個手機的 把沙盒數據 拿出來 來看每個用戶的數據(黑客也不可能拿到你的手機)。但是如果黑客撿到 你的手機 ,都不用登陸微信 就可以 通過微信APP的沙盒 拿到你和小三的偷情聊天記錄、能拿到你的銀行卡號,你的手機號(很多APP都把手機號、銀行卡號、聊天記錄 明文保存在沙盒里)。。你是不是會覺得微信 怎么這么low。我們只是拿微信舉個例子,微信還不會這么low。
黑客最主要的還是通過網絡來獲取 他們想要的數據(網絡的安全級別是最高的)。如果恰好 你的APP 加密密鑰 明文 保存到了沙盒里 或者 你的 數據通信 還沒有進行加密,恭喜你,你的數據和裸奔沒啥區別。。
有人說:“我就做了個聊天的APP,沒啥機密信息。再說 大家連的都是 公司的wifi、4G網絡,不會有問題的,所以我的通信才不加密,麻煩。”
舉個搞笑的栗子:
你現在在飛機場,連着免費wifi,正在和副總裁在微信里 談着 價值100個億的創意的時候,聊天記錄已經被 黑客 抓包獲取 ,然后賣給競爭對手了。。(只是舉個例子,微信的加密是相當安全的,微信很多的通訊還是用的HTTP,但是就算你拿到他們數據,也是無法解密的。這里舉例用微信,只是為了方便大家理解。免費wifi確實有可能是黑客設的坑,新聞上經常報道)。
所以不要讓自己的數據裸奔。。。
12、代碼調試信息安全管理
代碼方面:
12.1、在release環境下 NSLog 不要打印日志 否則iOS系統日志里都可以查看到,在.pch文件中加下面的幾行代碼就可以解決。很早大家都這么做了。
1 #ifdef DEBUG 2 #define NSLog(...) NSLog(__VA_ARGS__) 3 #define debugMethod() NSLog(@"%s", __func__) 4 #else 5 #define NSLog(...) 6 #define debugMethod() 7 #endif
現在很多APP的部分頁面開始使用 Swift,在Swift 文件中是允許用 NSLog 的語法來打印,但是 不要這么做,因為 這樣 就會導致這段代碼在 release環境 中也可以正常輸出。通過 PP助手、iTools,可以直接 查看 iOS的系統日志。也可以直接 通過Xcode-Window-Devices - 點最下面的向上的小箭頭,來看日志。
所以Swift中打印 還是用 print吧。
12.2、AFNetworking 的 allowInvalidCertificates 屬性 要設置成 false,validatesDomainName屬性 設置成true。否則 HTTPS通信就可以被解密。這塊涉及到AFnetworking 去年的通信漏洞 就不詳述了。
但是一般開發的 測試環境 的HTTPS 不是CA頒發的,而是自簽名證書,訪問的也不是域名,而是IP。所以可以在測試環境 忽略證書和域名,代碼如下:
1 #ifdef DEBUG 2 manager.securityPolicy.allowInvalidCertificates = YES; 3 manager.securityPolicy.validatesDomainName = NO; 4 #endif
像上文中提到的 接口模擬HTTPS 進行通信,基本上是破解不了的。非對稱加密畢竟還是 很安全的。
黑客也是有時間成本的,有性價比的。文中多次 寫到,可以增加破解的難度,不是這樣做了 就一定 不會被破解。
有人會覺得 在 代碼中 加密了 反正也 能被破解,那還加啥密,反正沒啥卵用。(比如 關鍵數據 加密 后 存到代碼里)
打個比方:我裝個防盜門 反正也防不住賊,干脆...就別裝門了,反正也沒啥卵用。
再比如:有幾個房間放着同樣價值的東西(賬戶數據、聊天數據等)。但這幾個房間,有的是全封閉防炸彈的,有的就只是一個木門,有的甚至門都是開着的,你會選擇哪個。。
這就像為什么現在 iOS 系統的越獄速度越來越慢,不是說越獄人員的水平變低了,而是現在越獄的用戶越來越少,像盤古這種公司通過越獄獲得的盈利也越來越少了,自然投入的精力就會變少。
關鍵數據加密后,存到代碼里,這樣總比你直接把明文保存到代碼中更難破解,我們要做的是讓黑客知道,你要來惹我,你就必須付出更多的時間和精力。