今天博客的主題是Keychain, 在本篇博客中會經過一個登錄的Demo將用戶名密碼存入到KeyChain中,而且查看一下KeyChain中存的是什麼東西,把這些內容給導出來。固然本篇博客的重點不是如何使用Keychain來存儲你的用戶名和密碼了。不過今天的博客中會用到這些知識。Apple的開發着文檔上有Keychain的完整使用實例(請參見iOS Keychain Services Tasks)。今天博客中用戶名和密碼的存儲和更新就是使用的官方文檔給的示例。也就是說,直接拷貝的開發文檔上的代碼呢,這些代碼今天就不往上拷貝了,具體的看官方的開發文檔便可。html
今天博客的主題是,將用戶名和密碼進行存儲,而後在下次登陸的時候從鑰匙串進行加載。固然keychain在同一個組中是能夠共享的,也就是說同一個開發者帳號下的App能夠進行keychain的共享的。咱們先不將用戶名密碼進行加密,直接存在keychain中,而後看一下效果。在而後就得使用一些加密策略對用戶名密碼進行處理了。下方會給出具體的實現細節。ios
1、KeyChain的使用git
KeyChain的使用在此呢不作多說,由於我以前也沒怎麼用過Keychain呢,今天博客中關於KeyChain操做的代碼主要來自於蘋果的開發文檔。下方截圖中的內容,是對keyChain的操做進行了一個簡單的封裝,keychainData用於暫存將要存儲到keychain中的數據。genericPasswordQuery則用於從KeyChain中查詢數據,kKeychainItemIdentifier就是咱們存儲在keyChain中的數據的惟一標示了。github
其餘關於KeyChain的操做代碼均可以在上述鏈接的開發文檔中找到,在此就不作過多贅述了。數據庫
封裝完KeyChainManager後,咱們就能夠調用這個類的單例來進行KeyChain的操做了。下方就是KeyChainManager的使用方式,從下方截圖中,能夠看出,將AES加密的代碼給註釋掉了,也就是傳給KeyChainManager什麼內容,就會存儲什麼內容的。關於Keychain的使用就先說這麼多,仍是那句話,上面的Apple官方文檔講的很清楚了,在此就不作過多贅述了。瀏覽器
2、查看Keychain數據庫中的內容安全
在越獄手機中咱們是能夠查看Keychain中所存儲的內容的。keychain在咱們是以數據庫的形式存儲在設備上的,存儲目錄爲「/private/var/Keychains」。恰好我旁邊就有越獄設備,下方就是keychain的存儲位置,下方這個keychain-2.db正是鑰匙串存儲內容的數據庫。app
既然咱們找到了這個文件的話,那麼咱們能夠將他拷貝到Mac上,能夠看看其存儲的是神馬內容。將上述文件考到Mac上後,咱們可使用SQLiteManager打開,能夠看一下里邊的內容。下方是keychain-2.db這個數據庫中的結構,其中有5張表,咱們能夠重點關注一下genp這張表的結構和內容。工具
下方這個截圖是對keychainData字典中的數據進行的打印,也就是說下方的數據是從Keychain中查詢出來的。咱們能夠看出下方字典的key與genp表中的字段是相對應的,因此嘍,咱們存在keychain中的一些數據其實是存儲在genp這張表中的。oop
下方是咱們對相關數據進行的查詢,表中的數據是很是的多的,不過咱們有SQL語句不是,能夠根據本身的信息對數據進行查看。固然從這直接看到的一些數據即便你存入Keychain中是沒有加密的數據,在表中有些數據是以二進制的形式存儲的,直接看也是看不出什麼的,那麼咱們就須要Keychain-dump這個工具了,下方回有介紹。
3、使用Snoop-it來抓取相應app中Keychain中的數據
咱們可使用Snoop-it來查看一些App中的數據,在此咱們就以我本身寫的Demo爲例。以前咱們存在Keychain中的數據,在代碼中沒有作任何的處理,就以字符串的形式直接存儲的,那麼接下來咱們就要使用Snoop-it來查看這些數據。
1.簡述Snoop-it的配置與使用
Snoop-it這個工具很是強大,查看keychain中存儲的數據是其功能之一,接下來就來認識一下這個工具。首先在你的Cydia商店中把這個(http://repo.nesolabs.de)源添加上,而後搜索snoop-it進行安裝便可。安裝後你的手機上會多一個帶着黃色帽子的小狗圖標的App, 這個就是咱們要使用的Snoop-it。下方截圖就是Snoop-it打開時的界面。點擊「Select App Store Apps」能夠選擇你要分析的App, 在Settings中能夠進行相應的配置。
在Mac瀏覽器中輸入上述http的訪問地址,而後打開你選擇監聽的App, 刷新頁面便可。從下方截圖中咱們是能夠看到一些存儲的信息是以明文的形式被獲取到的。這就說明直接以明文的形式存儲信息仍是有必定風險的,因此咱們要對數據進行加密。
咱們將代碼中的AES加密的相關代碼打開,將加密後的數據存儲到keychain中看一下效果。下方代碼就是調用AES加密模塊,將數據加密後在存儲到Keychain中。打開後,咱們從新運行工程,而後再觀察其效果。
固然,咱們對數據進行AES加密,使用Snoop-it監聽到的就是加密後的數據,這樣一來就增長了逆向工程的難度。
通過上述步驟,咱們能夠看出,將用戶名和密碼存儲到Keychain中,爲了安全起見呢仍是要進行加密處理的呢。說到這兒了,今天作這個Demo的時候,把App間共享keychain數據的內容也給搞了一下,過程並不複雜,須要將Keychain Sharing開關打開,而且添加上其餘App的Boundle ID便可。
4、Snoop-it的其餘做用
Snoop-it是很強大滴,接下來再看一下Snoop-it的另外一個強大的功能。它能夠瀏覽你手機上App的類的層級,固然在AppStore上下載的App也是適用的。而且能夠查看該App中某個文件的屬性和方法。方法是該類對應的全部方法,即便在.h文件中沒有留調用接口,也是能夠查看的,功能仍是蠻強大滴。好了今天的博客就到這兒吧。
5、Keychain-Dump
咱們還能夠經過KeyChain-Dump這個工具來查看鑰匙串中的內容,也就是適用keychain-dump能夠導出keychain中的數據。keychain-dump在github上的下載地址爲(https://github.com/ptoomey3/Keychain-Dumper)。將keychain-dump這個二進制文件拷貝到越獄設備上進行執行便可。剛拷貝過去的二進制文件是沒有執行權限的,下面爲了省事,直接賦值了一個最高權限,而後就能夠執行該二進制文件了。
執行完後,會導出keychain中存儲的內容,下方就是咱們上述Demo在keychain中存儲的數據。
在瀏覽數據的時候無心中看到了比較敏感的數據。下面這個截圖是家裏的WiFi帳號和密碼,可見,是明文存儲的呢。以前用這個設備存儲的全部WiFi密碼均可以看到呢,直接搜AirPort就能夠了。
因爲我的緣由呢,今天博客中所使用的登錄Demo就不往github上放了,還望你們諒解。