根據蘋果的介紹,ios裝置中的keychain是乙個安全的儲存容器,可以用來為不同應用儲存敏感資訊比如使用者名稱,密碼,網路密碼,認證令牌。蘋果自己用keychain來儲存wi-fi網路密碼,vpn憑證等等。它是乙個sqlite資料庫,位於/private/var/keychains/keychain-2.db,其儲存的所有資料都是加密過的。
識別符號(identifier)在後面我們要從keychain中取資料的時候會用到。如果你想要在應用之間共享資訊,那麼你需要指定訪問組(access group)。有同樣的訪問組 的應用能夠訪問同樣的keychain資訊。
要把資訊儲存到keychain中,使用 setobject:forkey: 方法。在這裡, (id)ksecattraccount 是乙個預先定義好的鍵(key),我們可以用它來儲存賬號名稱。 ksecclass指定了我們要儲存的某類資訊,在這裡是乙個通用的密碼。ksecvaluedata可以被用來儲存任意的資料,在這裡是乙個密碼。
ksecattraccessiblein變數用來指定這個應用合適需要訪問這個資料。我們需要對這個選項特別注意,並且使用最嚴格的選項。這個鍵(key)可以設定6種值。
當然,我們應該絕對不要使用ksecattraccessiblealways。乙個安全點的選項是ksecattraccessiblewhenunlocked。這也有些選項是以 thisdeviceonly 結尾的。如果選中了這個選項,那麼資料就會被以硬體相關的金鑰(key)加密,因此不能被傳輸到或者被其他裝置看到。即使它們提供了進一步的安全性,使用它們可能不是乙個好主意,除非你有 乙個更好的理由不允許資料在備份之間遷移。
現在把這個二進位制檔案上傳到你的裝置的/tmp資料夾,確保它可執行。
現在請確保儲存在/private/var/keychains/keychain-2.db的keychain檔案可以被讀取。
現在,執行這個可執行檔案
如你所見,它可以匯出所有的keychain資訊。你可以看到許多儲存在這裡的使用者名稱和密碼。例如,你可以看到mail應用把你賬號的使用者名稱和密碼儲存在keychain中。 類似的,你也可以找到你之前連線過的無線網路的密碼和其他更多的資訊。上述命令預設只會匯出通用和網路密碼。你可以通過-h命令檢視它的用法。
你可以通過 「-a」 命令匯出所有資料
使得keychain中的資料更安全的乙個做法就是使用乙個更強的口令。這是因為對某些特定的保護屬性(protection attributes)來說,口令會被用作加密keychain中的資料。 ios預設允許4位數字口令(從0-9999),因此很容易被人在幾分鐘之內暴力破解。本系列的後續文章中我們會看看暴力破解口令。設定字母加數字的密碼會讓破解花更多的時間。
乙個合適的保護屬性(protection attributes)和口令的組合會讓keychain的資料更難被獲取。
在本文中,我們看到了從ios裝置的keychain中匯出資料是多麼的容易。雖然在keychain中儲存憑證(credentials)和敏感資訊比nsuserdefaults和plist檔案更安全,但是, 想要破解它也不難。
references
keychain-dumper
注:之前我寫過一篇文章,keychain is not safe,大家可以對照著看看,有的應用還是在keychain中儲存密碼。雖然本文說keychain也容易被破解,不過比nsuserdefaults和plist安全得多,只要我們注意不要在keychain中儲存明密碼就會在很大程度上提公升安全性。
1 keychain
mac os 可以利用keychain儲存各應用中使用者的賬號密碼,讓使用者不用重複輸入,在ios中也有keychain,也可以在應用之間共享資料,只是有些限制,使用者無法通過手動控制。
要在社保上 keychain中的所有資料都以key-value的形式進行儲存,可以對其進行add、update、get、delete操作。
如果需要在應用裡使用keychain,需要匯入security.framework,keychain的操作介面宣告在標頭檔案secitem.h裡。直接使用secitem.h裡方法操作keychain,需要寫的**較為複雜,可以使用已經封裝好了的工具類sfhfkeychainutils,見:
keychain的access group的概念。
這個檔案的路徑要配置在 project->build setting->code signing entitlements裡,否則公共區無效,配置好後,須用你正式的證書簽名編譯才可通過,否則xcode會彈框告訴你code signing有問題。所以,蘋果限制了你只能同公司的產品共享keychain資料,別的公司訪問不了你公司產品的keychain。
2 keychain is not safe
對於沒有越獄的裝置,上述做法確實很安全。但是,對於jail break之後的裝置,風險就很大了。
通過上面的分析,我們知道要訪問keychain裡面的資料,需要
其實也可以不必獲得access group,因為access的匹配是可以用正規表示式的,也就是用*就可以匹配所有group了。 例子如下:
keychain-access-groupskey>
*string>
array>
dict>
plist>
3)在裝置上執行2)中介紹的keychain dumper,就可以得到所有的相關資訊。
但是,要在裝置上執行keychain dumper,就需要用chmod 777設定其許可權,需要root許可權,而jail break之後的預設密碼是:alpine。
最後可以獲得好幾個檔案,下面是裡面的2個例子。(密碼都被我用password字串替換)
a) 是家裡的wifi資訊
b)是某知名微博
我在越獄之後的ios 5.1的iphone,ipad, ios 6.1.2的ipad上都測試過,都可以獲得如上資訊。 實際中的例子遠不止這2個。很多應用都是直接存使用者的明文密碼的。
3 個人如何防止資訊洩露
4 對開發者和公司
不要儲存使用者的明文密碼。
encryption is a must for sensitive data。
不同App共享KeyChain資料
3 更改兩個工程的entitlements。在兩個工程的entitlements的keychain access groups 新增上面兩個bundle identifier 如下圖 5 在testwritekeychain工程中的 alloc initwithidentifier test wri...
在應用間利用KeyChain共享資料
mac os可以利用keychain儲存各應用中使用者的賬號密碼,讓使用者不用重複輸入。其實在ios中也有keychain,也可以用keychain在應用間共享資料,只是有一些限制,無法像mac os一樣開放,也無法讓使用者手動控制。那麼keychain到底如何使用呢?我們可以把keychain理解...
Keychain的簡單使用
一 簡介 二 基礎使用方法 增 secitemadd cfdictionaryref attributes,cftyperef result 增加乙個或多個條目到keychain,注意引數使用時需要將core foundation物件轉換成objective c型別物件使用 bridge trans...