今天博客的主題是Keychain, 在本篇博客中會通過一個登陸的Demo將用戶名密碼存入到KeyChain中,並且查看一下KeyChain中存的是什麼東西,把這些內容給導出來。當然本篇博客的重點不是如何使用Keychain來存儲你的用戶名和密碼了。不過今天的博客中會用到這些知識。Apple的開發著文 ...
今天博客的主題是Keychain, 在本篇博客中會通過一個登陸的Demo將用戶名密碼存入到KeyChain中,並且查看一下KeyChain中存的是什麼東西,把這些內容給導出來。當然本篇博客的重點不是如何使用Keychain來存儲你的用戶名和密碼了。不過今天的博客中會用到這些知識。Apple的開發著文檔上有Keychain的完整使用實例(請參見iOS Keychain Services Tasks)。今天博客中用戶名和密碼的存儲和更新就是使用的官方文檔給的示例。也就是說,直接拷貝的開發文檔上的代碼呢,這些代碼今天就不往上拷貝了,具體的看官方的開發文檔即可。
今天博客的主題是,將用戶名和密碼進行存儲,然後在下次登錄的時候從鑰匙串進行載入。當然keychain在同一個組中是可以共用的,也就是說同一個開發者賬號下的App可以進行keychain的共用的。我們先不將用戶名密碼進行加密,直接存在keychain中,然後看一下效果。在然後就得使用一些加密策略對用戶名密碼進行處理了。下方會給出具體的實現細節。
一、KeyChain的使用
KeyChain的使用在此呢不做多說,因為我之前也沒怎麼用過Keychain呢,今天博客中關於KeyChain操作的代碼主要來自於蘋果的開發文檔。下方截圖中的內容,是對keyChain的操作進行了一個簡單的封裝,keychainData用於暫存將要存儲到keychain中的數據。genericPasswordQuery則用於從KeyChain中查詢數據,kKeychainItemIdentifier就是我們存儲在keyChain中的數據的唯一標示了。
其他關於KeyChain的操作代碼都可以在上述連接的開發文檔中找到,在此就不做過多贅述了。
封裝完KeyChainManager後,我們就可以調用這個類的單例來進行KeyChain的操作了。下方就是KeyChainManager的使用方式,從下方截圖中,可以看出,將AES加密的代碼給註釋掉了,也就是傳給KeyChainManager什麼內容,就會存儲什麼內容的。關於Keychain的使用就先說這麼多,還是那句話,上面的Apple官方文檔講的很清楚了,在此就不做過多贅述了。
二、查看Keychain資料庫中的內容
在越獄手機中我們是可以查看Keychain中所存儲的內容的。keychain在我們是以資料庫的形式存儲在設備上的,存儲目錄為“/private/var/Keychains”。剛好我旁邊就有越獄設備,下方就是keychain的存儲位置,下方這個keychain-2.db正是鑰匙串存儲內容的資料庫。
既然我們找到了這個文件的話,那麼我們可以將他拷貝到Mac上,可以看看其存儲的是神馬內容。將上述文件考到Mac上後,我們可以使用SQLiteManager打開,可以看一下裡邊的內容。下方是keychain-2.db這個資料庫中的結構,其中有5張表,我們可以重點關註一下genp這張表的結構和內容。
下方這個截圖是對keychainData字典中的數據進行的列印,也就是說下方的數據是從Keychain中查詢出來的。我們可以看出下方字典的key與genp表中的欄位是相對應的,所以嘍,我們存在keychain中的一些數據實際上是存儲在genp這張表中的。
下方是我們對相關數據進行的查詢,表中的數據是非常的多的,不過我們有SQL語句不是,可以根據自己的信息對數據進行查看。當然從這直接看到的一些數據即使你存入Keychain中是沒有加密的數據,在表中有些數據是以二進位的形式存儲的,直接看也是看不出什麼的,那麼我們就需要Keychain-dump這個工具了,下方回有介紹。
三、使用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即可。
四、Snoop-it的其他作用
Snoop-it是很強大滴,接下來再看一下Snoop-it的另一個強大的功能。它可以瀏覽你手機上App的類的層級,當然在AppStore上下載的App也是適用的。並且可以查看該App中某個文件的屬性和方法。方法是該類對應的所有方法,即使在.h文件中沒有留調用介面,也是可以查看的,功能還是蠻強大滴。好了今天的博客就到這兒吧。
五、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上放了,還望大家諒解。