想在應用裡儲存帳號、密碼等資訊的話,直接存到 plist 裡顯然是不負責任的,自己折騰加密既麻煩又不能保證不被反編譯破解。實際上蘋果 ios 和 mac os x 系統自帶了一套敏感資訊儲存方案:"鑰匙串" (keychain)。
用原生的 security.framework 就可以實現鑰匙串的訪問、讀寫。但是只能在真機上進行,模擬器會出錯。在 github 上有個封裝的非常好的類來實現這個功能,讓你既能在模擬器又能在真機上訪問鑰匙串。
具體**:
//獲取密碼
+ (nsstring *) getpasswordforusername: (nsstring *) username andservicename: (nsstring *) servicename error: (nserror **) error;
//儲存密碼
+ (void) storeusername: (nsstring *) username andpassword: (nsstring *) password forservicename: (nsstring *) servicename updateexisting: (bool) updateexisting error: (nserror **) error;
//刪除密碼
+ (void) deleteitemforusername: (nsstring *) username andservicename: (nsstring *) servicename error: (nserror **) error;
直接使用
security框架讀寫鑰匙串,
參考:我們使用第三方類sfhfkeychainutils來操作鑰匙串 ( )
使用方法如下:
1、引入security.framework框架。
2、引入標頭檔案:#import"sfhfkeychainutils.h"
3、存密碼:
[cpp]view plain
copy
nsstring *service_name=@"demo";
[sfhfkeychainutils storeusername:@"dd"
andpassword:@"aa"
forservicename:service_name
updateexisting:1
error:nil];
4、取密碼:
[cpp]view plain
copy
nsstring *password = [sfhfkeychainutils getpasswordforusername:@"dd"
andservicename:service_name
error:nil];
nslog(@"%@",password);
5、刪除使用者:
[cpp]view plain
copy
[sfhfkeychainutils deleteitemforusername:@"dd" andservicename:service_name error:nil];
demo先行:
主要分為兩部分:
1.賦予應用對某個鑰匙串條目的訪問許可權。
2.寫入時配置鑰匙串條目,對ksecattraccessgroup的值進行設定。
1.新建乙個plist檔案,在plist中的陣列中新增可以訪問的條目的名字(如keychainaccessgroups.plist),結構如下:
2.在build-setting中進行配置,搜尋entitlement,注意路徑別配置錯:
鑰匙串的操作介面都位於security.framework框架下,它是乙個sqlite資料庫,位於/private/var/keychains/keychain-2.db,其儲存的所有資料都是加密過的。
其過程可以總結為:
1.配置查詢字典,格式是nsmutabledictionary,需要配置的內容下次再分析,功能就相當於寫一句sql一樣。
2.進行增(secitemadd)、刪(secitemdelete)、改(secitemupdate)、查(secitemcopymatching)。
**demo裡面有,這裡以增為例,下面有2個語句,乙個是增加到自身bundleid的鑰匙串條目,乙個是增加到共享的條目中。
//函式 [keychainquery setobject:accessgroupitem forkey:(id)ksecattraccessgroup] 的配置,就是指定了這次寫入時的鑰匙串條目,不寫入時預設為plist配置檔案裡第乙個條目。建立乙個基本的查詢字典
+ (nsmutabledictionary *)getkeychainquery:(nsstring *)service
+ (void)addkeychaindata:(id)data forkey:(nsstring *)key
+(void)addsharekeychaindata:(id)data forkey:(nsstring *)key
在查詢中,也可以對查詢的鑰匙串條目進行配置,缺省會對所有有許可權的條目進行搜尋。
三、keychain的組成:
參考部落格:
每乙個keychain的組成如圖,整體是乙個字典結構.
1.ksecclass key 定義屬於那一種型別的keychain
2.不同的型別包含不同的attributes,這些attributes定義了這個item的具體資訊
3.每個item可以包含乙個密碼項來儲存對應的密碼
對於最常用密碼型別,我們應該如下配置
ksecattraccessiblein變數用來指定這個應用合適需要訪問這個資料。我們需要對這個選項特別注意,並且使用最嚴格的選項。這個鍵(key)可以設定6種值。
四、安全
但是!!如果使用帶有乙個*萬用字元的entitlments,因此它能夠訪問keychain中的所有條目。。或者,如果用乙個包含所有訪問組(access group)的entitlements檔案,也能夠訪問所有的keychain資料。
但以上僅限模擬器,在真機除錯時,假如你plist裡的條目,和自己除錯檔案(pro file)的id不一致時(比如:ec0880a1.company),進行真機編譯的時候是會報錯的。
關於keychain還有很多值得挖掘的,比如具體在sqlite資料庫的表單儲存方式等,有錯歡迎指正。
在蘋果Mac上如何建立新的鑰匙串?
1.單擊位於桌面右上角的 放大鏡 圖示以訪問spotlight搜尋。2.在搜尋欄位中鍵入 keychain 然後從搜尋結果中開啟 keychain access 3.在選單欄中單擊 檔案 然後從下拉列表中選擇 新鑰匙串 如下所示。4.系統會提示您輸入新鑰匙串的密碼。如果使用者堅持更改登入鑰匙串的密碼...
在MyEclipes裡儲存自定義的jsp模板
在 myeclipse myeclipse eclipse plugins com.genuitec.eclipse.wizards 6.0.1.zmyeclipse601200710 templates jsp 目錄下找到jsp.vtl,複製乙份,重新命名為jsp2.vtl,然後把裡面的內容修改為...
使用七牛雲儲存解決ios7 1的app部署問題
一.問題描述 這裡不詳細描述https協議。https的信任繼承基於預先安裝在瀏覽器中的證書頒發機構 如verisign microsoft等 意即 我信任證書頒發機構告訴我應該信任的 因此,乙個到某 的https連線可被信任,當且僅當 1.使用者相信他們的瀏覽器正確實現了https且安裝了正確的證...