iOS APP 安全測試

1、ipa包加殼

  首先,我們可以通過iTunes 下載 AppStore的ipa文件(蘋果 把開發者上傳的ipa包 進行了加殼再放到AppStore中),所以我們從AppStore下載的ipa都是加殼的,所以不能直接用來反編譯。

  得到ipa文件 可以分析APP 里包含的一些資源,如:圖片、plist文件、靜態wap頁、.bundle 等。

  所以不要 在plist文件、項目中的靜態文件中 存儲關鍵的信息,如果要保存,記得 對稱加密(這樣可以增加破解的難度)。

  如果是越獄的手機,從 手機上的PP助手下載的ipa包 都是 脫殼之后的,可以直接用來反編譯。

?

2、敏感信息存儲位置

  我們可以用軟件 查看 APP的沙盒,查看里面存儲的 文件:sqlite、plist(NSUserdefault會存到Library下的Preferences中 的 plist文件中)、圖片等,NSUserdefault 中不要保存關鍵信息,如果要保存,還是加密吧。。sqlite也是這樣子的。

  iOS 8.3之前 不越獄的手機也可以 直接用MAC上的PP助手、iTool 來查看 任何APP的沙盒(系統APP除外)。iOS 8.3之后就不行了。

  越獄手機都可以查看任意APP的沙盒,包括系統APP的沙盒。還有iOS的系統目錄等。

?

3、設備安全(越獄,丟失)

  越獄手機直接用PP助手下載的就是 脫殼的ipa,所以不用再脫了。對AppStore下載的ipa包 可以用工具對加殼的ipa 進行脫殼,再用IDA、Hopper 進行反編譯,進行分析 ,可以得到 近乎易懂的 偽代碼。但是反編譯后的代碼 要 一個方法一個方法的去分析,類似面向過程編程。。當然也有工具 去提取 項目中的所有.h文件。不過 反編譯 終歸是個 耐心的活,急躁的人容易砸電腦。

?

4、APP反編譯(逆向工程)

  所有的APP都是可以反編譯的,所以 很關鍵的數據 最好通過接口獲取。

  那么接口如何保證安全呢。首先用HTTPS,雖然HTTPS已經很安全了,但是數據也是有可能被破解的,這個后面會介紹。。所以 接口一定要自己加密。

  非對稱加密(RSA)現在 還是沒有辦法破解的,但是因為 非對稱加密的效率低,所以很少有企業將所有的接口都用非對稱加密。

  接口如果用對稱加密,密鑰 放到代碼里 是能被反編譯出來的。如果你的 APP的安全性很高,就不要把密鑰 寫到代碼里。

?

    可以這樣處理:

  先通過非對稱加密的接口 獲取密鑰,然后 再在 后面的 接口通信中 用這個密鑰進行加密。這樣做 就類似 HTTPS 的簡化版實現了。安全性很高。目前應該 是不能破解的。

?

?

5、代碼內容加密(對稱加密/非對稱加密)

  根據APP的安全性,也可以把 關鍵數據 寫在代碼里,可以保存的是加密后的數據。比如,我給一個變量賦值:U2FsdGVkX1+rN+sgpLmOYTqoVhRRerZj9oobZAIPzjo=,你不知道 我這個字符串解密后是 123456,我只是使用的時候才解密處理用。

  這樣也只是增加了黑客獲取關鍵數據的難度。

?

6、安全密鑰更新周期

  密鑰要定期更換。比如 3個月 或半年換一次,如果密鑰是從接口通過非對稱加密 獲取的,直接修改服務端就可以了。

  如果密鑰是寫在代碼里的。就等APP升級新的版本的時候,新版本的APP和其對應的接口版本 都 修改為新的密鑰 就可以了。

  舊的接口版本和APP版本還用以前的密鑰,等強制更新的時候才會失效。

  如果一個APP 一個密鑰用上幾年都不變 ,是很危險的。離職的人員都可以直接用以前 的代碼 來獲取相關的數據。特別是 支付相關的,有的服務端甚至沒有 去校驗支付的金額或其他數據,導致 離職人員用1分錢 可以買到 任何價格的 線上產品(服務端這種在線上環境留后門的安全性問題,我是真的遇到有人這么搞)。。

?

7、代碼混淆

  最好能 進行 代碼混淆,能增加反編譯的難度,當然只是增加了難度,還是能破解的。但是 代碼混淆 的 性價比是很高的,就是你這邊付出了 一點時間,而黑客 就要多付出幾十倍 的時間。。其實 接口 自己加密 的性價比也很高。

?

8、接口安全(雙向加密)

  接口返回的數據 最好也進行 加密。比如,現在大家都連我的熱點,或者代理服務器,我是有可能 直接 獲取你的APP的 HTTPS 解密后的json數據(如何獲取相見《逆向工程》)。當然,如果你覺得 你的APP返回的json數據都是 不重要的,也可以不對數據進行加密。

  像微信、QQ、支付寶這種 安全性高的,通信兩邊的數據 收發 ?都 應該 進行加密的。

?

9、通訊安全,第三方庫漏洞

  像HTTPS本身 是否有漏洞這種我們就不去說了。就 去年iOS的AFNetworking 漏洞事件,完全是 代碼的問題。雖然不是HTTPS的安全機制的問題。但是 黑客還是能很容易拿到HTTPS解密后的數據。

  去年iOS的AFNetworking曝SSL漏洞? 就涉及2.5萬個APP。 有的銀行的APP,只用了HTTPS,通信都不加密,就很容易拿到明文數據了。有的APP里的各種數據都 采用復雜的加密算法,破解人員看到都煩,去破解這個APP的時間還不如去搞其他的幾個APP。

  HTTPS 本身是安全的。但是數據還是可能被破解。所以 不要覺得 我只用HTTPS 就安全了。理論上 說任何 的 協議、代碼都是可能有漏洞的,只是有的現在 還沒被發現或破解,并不代表一直不能被破解。。

?

  10、敏感信息安全加密

  黑客不會 去一個手機一個手機的 把沙盒數據 拿出來 來看每個用戶的數據(黑客也不可能拿到你的手機)。但是如果黑客撿到 你的手機 ,都不用登陸微信 ?就可以 通過微信APP的沙盒 拿到你和小三的偷情聊天記錄、能拿到你的銀行卡號,你的手機號(很多APP都把手機號、銀行卡號、聊天記錄 明文保存在沙盒里)。。你是不是會覺得微信 怎么這么low。我們只是拿微信舉個例子,微信還不會這么low。

?

11、通訊網絡安全

  黑客最主要的還是通過網絡來獲取 他們想要的數據(網絡的安全級別是最高的)。如果恰好 你的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 系統的越獄速度越來越慢,不是說越獄人員的水平變低了,而是現在越獄的用戶越來越少,像盤古這種公司通過越獄獲得的盈利也越來越少了,自然投入的精力就會變少。

?

  關鍵數據加密后,存到代碼里,這樣總比你直接把明文保存到代碼中更難破解,我們要做的是讓黑客知道,你要來惹我,你就必須付出更多的時間和精力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393943.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393943.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393943.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle 與 client端執行結果不一致_Oracle -PLSQLDeveloper 13 數據庫連接

關于oracle 及PLSQLDeveloper 13如何下載,安裝流程不一一贅述,網絡帖子很多,知乎直接搜索亦可。本次主要分享:學習前輩們關于安裝流程中出現設置報錯,應如何處理(本人個例,通過網絡找思路&#…

去除文件頭部的u+feff_關于FEFF的簡短故事,一個不可見的UTF-8字符破壞了我們的CSV文件

去除文件頭部的ufeffToday, we encountered an error while trying to create some database seeds from a CSV. This CSV was originally generated by me using a Ruby script which piped the output to a file and saved as a CSV.今天,我們在嘗試從CSV創建一些…

Redis——學習之路一(初識redis)

在接下來的一段時間里面我要將自己學習的redis整理一遍,下面是我整理的一些資料: Redis是一款依據BSD開源協議發行的高性能Key-Value存儲系統(cache and store),所以redis是可以查看源代碼https://github.com/MSOpenTe…

matlab 處理dat文件畫圖,matlab_DAT_processing matlab處理dat文件并進行繪圖 - 下載 - 搜珍網...

matlab實驗2/11.txtmatlab實驗2/B00001.datmatlab實驗2/B00002.datmatlab實驗2/B00003.datmatlab實驗2/B00004.datmatlab實驗2/B00005.datmatlab實驗2/B00006.datmatlab實驗2/B00007.datmatlab實驗2/corv.txtmatlab實驗2/cory.txtmatlab實驗2/matlab批量載入數據.txtmatlab實驗…

leetcode面試題 08.03. 魔術索引(二分)

魔術索引。 在數組A[0…n-1]中,有所謂的魔術索引,滿足條件A[i] i。給定一個有序整數數組,編寫一種方法找出魔術索引,若有的話,在數組A中找出一個魔術索引,如果沒有,則返回-1。若有多個魔術索引…

python返回序列中的最小元素_python實現獲取序列中最小的幾個元素

本文實例講述了python實現獲取序列中最小的幾個元素。分享給大家供大家參考。具體方法如下:import heapqimport randomdef issorted(data):data list(data)heapq.heapify(data)while data:yield heapq.heappop(data)alist [x for x in range(10)]random.shuffle(a…

apache訪問快捷方式

<VirtualHost *:80>   DocumentRoot "XXX"   ServerName XXX   Alias /pdodata/ "XXX"</VirtualHost> 其中 Alias /pdodata/ "XXX" /data/是快捷方式名稱 后面的代表快捷方式具體目錄名稱轉載于:https://www.cnblogs.com/…

css----實現checkbox圖片切換

1、效果圖 2、代碼 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>checkbox</title><style type"text/css">label {width: 20px;font-size: 12px;cursor: pointer;}label i {display: inline-block…

Node.js 究竟是什么?

在網上看到一篇介紹Node.js的文章&#xff0c;很好的介紹了Node.js Michael Abernethy, 自由程序員, Freelancer 2011 年 10 月 09 日 (最初于 2011 年 4 月 26 日) Node.js 究竟是什么&#xff1f; 一個 “編碼就緒” 服務器 Node 是一個服務器端 JavaScript 解釋器&#xff…

react中綁定點擊事件_在React中綁定事件處理程序的最佳方法

react中綁定點擊事件by Charlee Li通過李李 在React中綁定事件處理程序的最佳方法 (The best way to bind event handlers in React) Binding event handlers in React can be tricky (you have JavaScript to thank for that). For those who know the history of Perl and P…

json_decode php數組,json_decode轉化為數組加true,json_encode和json_decode區別

一、json_encode和json_decode區別1、json_encode&#xff1a;對象/數組 ---> json2、json_decode&#xff1a;json ---> 對象/數組二、json_decode轉化為數組轉化為數組時&#xff0c;第二個參數很重要&#xff1a;不加true會以PHP對象輸出, 加true輸出PHP數組&#xff…

leetcode1219. 黃金礦工(回溯)

你要開發一座金礦&#xff0c;地質勘測學家已經探明了這座金礦中的資源分布&#xff0c;并用大小為 m * n 的網格 grid 進行了標注。每個單元格中的整數就表示這一單元格中的黃金數量&#xff1b;如果該單元格是空的&#xff0c;那么就是 0。 為了使收益最大化&#xff0c;礦工…

【無刪減】Python老司機收藏夾的17個國外免費學習網站

用Python編寫代碼一點都不難&#xff0c;事實上它一直被贊譽為最容易學的編程語言。如果你準備學習web開發&#xff0c; Python是一個不錯的開始&#xff0c;甚至想做游戲的話&#xff0c;用Python來開發游戲的資源也有很多。這是快速學習這門語言的途徑之一。許多程序員都把Py…

iframe vue 前進 后退_vue常見面試題

1、說說你對 SPA 單頁面的理解&#xff0c;它的優缺點分別是什么&#xff1f;SPA&#xff08; single-page application &#xff09;僅在 Web 頁面初始化時加載相應的 HTML、JavaScript 和 CSS。一旦頁面加載完成&#xff0c;SPA 不會因為用戶的操作而進行頁面的重新加載或跳轉…

C#編寫運行在Linux環境下的采用Mediainfo來獲取多媒體文件信息的代碼

C#編寫運行在Linux環境下的采用Mediainfo來獲取多媒體文件信息的代碼 原文:C#編寫運行在Linux環境下的采用Mediainfo來獲取多媒體文件信息的代碼項目開始設計的是運行在windows下&#xff0c;所以一開始采用的是windows服務模式來獲取多媒體文件信息&#xff0c;后來要求調整為…

如何用chrome擴展將網頁變成黑底白字,用以保護視力

不知道有沒有科學依據&#xff0c;自己感覺黑底白字對視力好些&#xff0c;于是動手加個chrome擴展&#xff1a; 第一步&#xff1a;建個文件夾&#xff0c;名稱比如叫changeColor; 第二步&#xff1a;在changeColor文件夾中建三個文件&#xff1a;manifest.json 、 backgrou…

從零學習機器學習_機器學習:如何從零變英雄

從零學習機器學習以“為什么&#xff1f;”開頭 并以“我準備好了&#xff01;”結尾 (Start with “Why?” and end with “I’m ready!”) If your understanding of A.I. and Machine Learning is a big question mark, then this is the blog post for you. Here, I gradu…

sqoop動態分區導入mysql,使用sqoop import從mysql往hive含分區表中導入數據的一些注意事項...

先看下面這條語句&#xff0c;它實現的功能是將特定日期的數據從mysql表中直接導入hive$ sqoop import \--connect jdbc:mysql://192.168.xx.xx:3306/db_name?useSSLfalse \--username xxx --password xxxxxx \--query "select d.id, d.callsign, d.sobt from t_flight_b…

leetcode面試題 08.04. 冪集(遞歸)

冪集。編寫一種方法&#xff0c;返回某集合的所有子集。集合中不包含重復的元素。 說明&#xff1a;解集不能包含重復的子集。 示例: 輸入&#xff1a; nums [1,2,3] 輸出&#xff1a; [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 代碼 class Solution {List&l…

gatsby_我如何使用Gatsby和Netlify建立博客

gatsbyby Pav Sidhu通過帕夫西杜(Pav Sidhu) 我如何使用Gatsby和Netlify建立博客 (How I Built My Blog Using Gatsby and Netlify) 您能說出更具標志性的二人??組合嗎&#xff1f; &#xff1f; (Can you name a more iconic duo? ?) Years ago, whenever I built a stat…