iOS 鑰匙串KeyChain的簡單介紹

前段時間卸載了QQ审轮,之后又重新安裝了肥哎,奇怪的是賬號和密碼信息竟然還在辽俗,就覺得好奇怪,百度了一波篡诽,挖出了KeyChain崖飘。下面給大家分享一下我的認(rèn)知和它的簡單使用,有不同見解的歡迎提出杈女。

a)什么是鑰匙串朱浴?

KeyChain在Mac上大家都比較熟悉,主要進(jìn)行一些敏感信息存儲使用如用戶名达椰,密碼翰蠢,網(wǎng)絡(luò)密碼,認(rèn)證令牌啰劲,Wi-Fi網(wǎng)絡(luò)密碼梁沧,VPN憑證等。iOS中鑰匙扣蝇裤,也有相同的功能實現(xiàn)廷支,保存的信息存儲在設(shè)備中,獨立于每個App沙盒之外猖辫。作者這篇就簡單整理下iOS中的鑰匙扣酥泞。

特點:

1。相對于NSUserDefault存儲一些數(shù)據(jù)啃憎,會更加安全。

2似炎。即便App被卸載辛萍,存儲的信息依舊存在,再次安裝App羡藐,存儲是信息依舊可以使用贩毕。

3。相同的團(tuán)隊ID開發(fā)仆嗦,可實現(xiàn)多個應(yīng)用共享數(shù)據(jù)辉阶。

b)結(jié)構(gòu)

KeyChain和NSUserDefault 的結(jié)構(gòu)類似,也是一個個鍵值對key-value相互映射組成的瘩扼。

在iOS中每個APP 都有屬于自己的KeyChain谆甜,最常用就是保存用戶的賬戶和密碼,就是記住密碼集绰,放在這里很安全规辱,蘋果負(fù)責(zé)幫我們加密再存起來,假如用NSUserDefault 保存這些秘密數(shù)據(jù),生成的plist文件容易被拿到(----->Library/Preferences),而且還要自己做加密栽燕。

(說實話罕袋,結(jié)構(gòu)這方面的理解還沒達(dá)到能表達(dá)的很詳細(xì)的地步改淑,所以暫時只share這么一些,有更好的見解的歡迎指教T⊙丁)

c) 使用

KeyChain 主要的用法也就是添加朵夏,刪除,修改榆纽,查詢仰猖。這里我自己做了個簡單的封裝,歡迎大家使用掠河,話不多說亮元,直接上代碼。

ATKeyChain.h

#import <Foundation/Foundation.h>

@interfaceATKeyChain :NSObject

#pragma mark存儲用戶偏好設(shè)置到NSUserDefults

+(void)saveUserData:(id)data forKey:(NSString*)key;

#pragma mark讀取用戶偏好設(shè)置

+(id)readUserDataForKey:(NSString*)key;

#pragma mark刪除用戶偏好設(shè)置

+(void)removeUserDataForkey:(NSString*)key;

@end

ATKeyChain.m

#import "ATKeyChain.h"

@implementation ATKeyChain

#pragma mark ----public method
+ (NSMutableDictionary *)getKeychainQuery:(NSString *)key {
    
    return [NSMutableDictionary dictionaryWithObjectsAndKeys:(id)kSecClassGenericPassword,(id)kSecClass,
            key, (id)kSecAttrService,
            key, (id)kSecAttrAccount,
            (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,
            nil];
    
}

#pragma mark ----寫入
// 說明: 該封裝 添加與更新 為同一方法, 不進(jìn)行判斷, 直接先刪除后添加
+(void)saveUserData:(id)data forKey:(NSString*)key{
    
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:key];
    
    SecItemDelete((CFDictionaryRef)keychainQuery);
    
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];
    
    SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
}

#pragma mark ----讀取
+(id)readUserDataForKey:(NSString*)key; {
    
    id data = nil;
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:key];

    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
    [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
    CFDataRef keyData = NULL;
    if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
        @try {
            data = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
        } @catch (NSException *e) {
            NSLog(@"Unarchive of %@ failed: %@", key, e);
        } @finally {
        }
    }
    if (keyData)
        CFRelease(keyData);
    return data;
}

#pragma mark ----刪除
+(void)removeUserDataForkey:(NSString*)key{
    
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:key];
    
    SecItemDelete((CFDictionaryRef)keychainQuery);
}

@end

調(diào)用

    NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
    [userInfo setObject:@"Mars_pananting" forKey:@"userName"];
    [userInfo setObject:@"12345678" forKey:@"password"];

    //添加
    [ATKeyChain saveUserData:userInfo forKey:@"userInfo"];

    //讀取
    NSMutableDictionary *result =[ATKeyChain readUserDataForKey:@"userInfo"];
    NSLog(@"result ==%@",result);

    //移除
    [ATKeyChain removeUserDataForkey:@"userInfo"];

result.png

好了唠摹,以上我就是我對KeyChain 的簡單總結(jié)爆捞。希望能給大家?guī)韼椭?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市勾拉,隨后出現(xiàn)的幾起案子煮甥,更是在濱河造成了極大的恐慌,老刑警劉巖藕赞,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件成肘,死亡現(xiàn)場離奇詭異,居然都是意外死亡斧蜕,警方通過查閱死者的電腦和手機(jī)双霍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來批销,“玉大人洒闸,你說我怎么就攤上這事【浚” “怎么了丘逸?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掀宋。 經(jīng)常有香客問我深纲,道長,這世上最難降的妖魔是什么劲妙? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任湃鹊,我火速辦了婚禮,結(jié)果婚禮上是趴,老公的妹妹穿的比我還像新娘涛舍。我一直安慰自己,他們只是感情好唆途,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布富雅。 她就那樣靜靜地躺著掸驱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪没佑。 梳的紋絲不亂的頭發(fā)上毕贼,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機(jī)與錄音蛤奢,去河邊找鬼鬼癣。 笑死,一個胖子當(dāng)著我的面吹牛啤贩,可吹牛的內(nèi)容都是我干的待秃。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼痹屹,長吁一口氣:“原來是場噩夢啊……” “哼章郁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起志衍,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤暖庄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后楼肪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體培廓,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年春叫,在試婚紗的時候發(fā)現(xiàn)自己被綠了肩钠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡暂殖,死狀恐怖蔬将,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情央星,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布惫东,位于F島的核電站莉给,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏廉沮。R本人自食惡果不足惜颓遏,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滞时。 院中可真熱鬧叁幢,春花似錦、人聲如沸坪稽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至黍判,卻和暖如春豫尽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顷帖。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工美旧, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贬墩。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓榴嗅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陶舞。 傳聞我的和親對象是個殘疾皇子嗽测,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

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