KeychainItemWrapper訪(fǎng)問(wèn)鑰匙串

https://github.com/soffes/sskeychain

代碼
KeychainItemWrapper *keychain=[[KeychainItemWrapper alloc] initWithIdentifier:@"xxxxxx" accessGroup:nil];//xxxx 自定義

保存
[keyWrapper setObject:@"myChainValues" forKey:(id)kSecAttrService];
[keyWrapper setObject:[usernameTextField text] forKey:(id)kSecAttrAccount];// 上面兩行用來(lái)標(biāo)識(shí)一個(gè)Item
[keyWrapper setObject:[passwordTextField text] forKey:(id)kSecValueData];

讀取
[usernameTextField setText:[keyWrapper  objectForKey:(id)kSecAttrAccount]];
[passwordTextField setText:[keyWrapper objectForKey:(id)kSecValueData]];

iOS的keychain服務(wù)提供了一種安全的保存私密信息(密碼蜻拨,序列號(hào)画舌,證書(shū)等)的方式蚕断,每個(gè)ios程序都有一個(gè)獨(dú)立的keychain存儲(chǔ)韵吨。相對(duì)于NSUserDefaults、文件保存等一般方式讽营,keychain保存更為安全虎忌,而且keychain里保存的信息不會(huì)因App被刪除而丟失,所以在重裝App后橱鹏,keychain里的數(shù)據(jù)還能使用膜蠢。從ios 3。0開(kāi)始莉兰,跨程序分享keychain變得可行挑围。

如何需要在應(yīng)用里使用使用keyChain,我們需要導(dǎo)入Security.framework 糖荒,keychain的操作接口聲明在頭文件SecItem.h里杉辙。直接使用SecItem.h里方法操作keychain,需要寫(xiě)的代碼較為復(fù)雜寂嘉,為減輕咱們程序員的開(kāi)發(fā)奏瞬,我們可以使用一些已經(jīng)封裝好了的工具類(lèi),下面我會(huì)簡(jiǎn)單介紹下我用過(guò)的兩個(gè)工具類(lèi):KeychainItemWrapper和SFHFKeychainUtils泉孩。

KeychainItemWrapper (下載)
  KeychainItemWrapper是apple官方例子“GenericKeychain”里一個(gè)訪(fǎng)問(wèn)keychain常用操作的封裝類(lèi)硼端,在官網(wǎng)上下載了GenericKeychain項(xiàng)目后,只需要把“KeychainItemWrapper.h”和“KeychainItemWrapper.m”拷貝到我們項(xiàng)目寓搬,并導(dǎo)入Security.framework 珍昨。KeychainItemWrapper的用法:

[html] view plaincopy
  /** 初始化一個(gè)保存用戶(hù)帳號(hào)的KeychainItemWrapper */

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Account Number" accessGroup:@"YOUR_APP_ID_HERE.com.yourcompany.AppIdentifier"];
  //保存帳號(hào)
  [wrapper setObject:@"<帳號(hào)>" forKey:(id)kSecAttrAccount]; //保存密碼
  [wrapper setObject:@"<帳號(hào)密碼>" forKey:(id)kSecValueData]; //從keychain里取出帳號(hào)密碼
  NSString *password = [wrapper objectForKey:(id)kSecValueData];
  //清空設(shè)置
  [wrapper resetKeychainItem];

其中方法“- (void)setObject:(id)inObject forKey:(id)key;”里參數(shù)“forKey”的值應(yīng)該是Security.framework 里頭文件“SecItem.h”里定義好的key,用其他字符串做key程序會(huì)崩潰句喷!

SFHFKeychainUtils(下載)
  SFHFKeychainUtils是另一個(gè)封裝了KeyChain簡(jiǎn)單操作的第三方類(lèi)庫(kù)镣典,使用上比KeychainItemWrapper要簡(jiǎn)單點(diǎn),SFHFKeychainUtils只提供了獲取唾琼、保存和刪除三個(gè)方法:

  [html] view plaincopy
  #import <UIKit/UIKit.h>
  
  @interface SFHFKeychainUtils : NSObject {
  
  }
  
  /** 從Keychain里獲取用戶(hù)密碼
  *param username 用戶(hù)名
  *param serviceName 服務(wù)名
  *return NSString 用戶(hù)名對(duì)應(yīng)的密碼
  */
  + (NSString *) getPasswordForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error;
  
  /**
  *把用戶(hù)的密碼保存到Keychain里
  *@param username 用戶(hù)名
  *@param password 要保存的密碼
  *@param serviceName 本條keychains所屬的服務(wù)(組)
  *return BOOL 是否存儲(chǔ)成功
  */
  + (BOOL) storeUsername: (NSString *) username andPassword: (NSString *) password forServiceName: (NSString *) serviceName updateExisting: (BOOL) updateExisting error: (NSError **) error;
  
  /**
  * 刪除某個(gè)用戶(hù)信息
  *param username 用戶(hù)名
  *param serviceName 用戶(hù)所屬的服務(wù)(組)
  *return BOOL 是否刪除成功
  */
  + (BOOL) deleteItemForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error;
  
  @end
  使用方法:
  [html] view plaincopy
  #define ServiceName @"com.mycompany.yourAppServiceName"
  NSError *error;
  NSString *userName = @"<用戶(hù)名>";
  NSString *password = @"<用戶(hù)密碼>";
  
  /** 保存用戶(hù)的密碼*/
  BOOL saved = [SFHFKeychainUtils storeUsername:userName
  andPassword:password
  forServiceName:ServiceName
  updateExisting:YES
  error:&error ];
  if (!saved) {
  NSLog(@"保存密碼時(shí)出錯(cuò):%@", error);
  }
  
  error = nil;
  NSString *thePassword = [SFHFKeychainUtils getPasswordForUsername:userName
  andServiceName:ServiceName
  error:&error];
  if(error){
  NSLog(@"從Keychain里獲取密碼出錯(cuò):%@", error);
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兄春,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锡溯,更是在濱河造成了極大的恐慌赶舆,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祭饭,死亡現(xiàn)場(chǎng)離奇詭異芜茵,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)倡蝙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)九串,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人寺鸥,你說(shuō)我怎么就攤上這事猪钮。” “怎么了胆建?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵躬贡,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我眼坏,道長(zhǎng)拂玻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任宰译,我火速辦了婚禮檐蚜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沿侈。我一直安慰自己闯第,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布缀拭。 她就那樣靜靜地躺著咳短,像睡著了一般填帽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咙好,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天篡腌,我揣著相機(jī)與錄音,去河邊找鬼勾效。 笑死嘹悼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的层宫。 我是一名探鬼主播杨伙,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼萌腿!你這毒婦竟也來(lái)了限匣?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤毁菱,失蹤者是張志新(化名)和其女友劉穎膛腐,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鼎俘,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哲身,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贸伐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勘天。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捉邢,靈堂內(nèi)的尸體忽然破棺而出脯丝,到底是詐尸還是另有隱情,我是刑警寧澤伏伐,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布宠进,位于F島的核電站,受9級(jí)特大地震影響藐翎,放射性物質(zhì)發(fā)生泄漏材蹬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一吝镣、第九天 我趴在偏房一處隱蔽的房頂上張望堤器。 院中可真熱鬧,春花似錦末贾、人聲如沸闸溃。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辉川。三九已至表蝙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乓旗,已是汗流浹背府蛇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寸齐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓抄谐,卻偏偏與公主長(zhǎng)得像渺鹦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛹含,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • iOS的keychain服務(wù)提供了一種安全的保存私密信息(密碼毅厚,序列號(hào),證書(shū)等)的方式浦箱,每個(gè)ios程序都有一個(gè)獨(dú)立...
    灰斗兒閱讀 1,118評(píng)論 1 0
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理吸耿,服務(wù)發(fā)現(xiàn),斷路器酷窥,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • web前端基礎(chǔ)筆記 學(xué)習(xí)web前端開(kāi)發(fā)基礎(chǔ)技術(shù)需要掌握:HTML咽安、CSS、JavaScript語(yǔ)言蓬推。下面我們就來(lái)了...
    Z314閱讀 273評(píng)論 0 0
  • GitPages博客搭建教程 個(gè)人站建立已有近四個(gè)月,也一直有人詢(xún)問(wèn)如何搭建一個(gè)個(gè)人博客,索性就這一問(wèn)題寫(xiě)一篇教程...
    TaXue_WWL閱讀 8,478評(píng)論 0 6
  • 昨天妆棒,興奮的跟好友說(shuō),我打耳朵眼了沸伏。長(zhǎng)久以來(lái)糕珊,內(nèi)心深處一直就有這個(gè)愿望,卻從未勇敢的實(shí)施過(guò)毅糟『煅。總是害怕那一丁點(diǎn)...
    那年凌汛閱讀 401評(píng)論 3 1