iOS簡單使用keychain存儲密碼


2016.12.22最新更新
最近一直有朋友說不知道怎么用,特來更新了 PDKeyChain,添加了注釋嘲恍,有問題可以提 issue 歡迎討論。


2016.8.23最新更新
最近一直有朋友問源碼雄驹,整理了一下發(fā)在這里佃牛。


2016.3.23最新更新
近期項目中又用到keychain,于是回頭翻了翻以前寫的代碼医舆,感覺寫的/(ㄒoㄒ)/~~
設計不科學俘侠,命名不規(guī)范象缀,怎么看怎么別扭,那就重寫吧~


Tips:在實習過程中爷速,有次讓我實現(xiàn)一個app七天免登陸功能央星。當時沒細想,直接就用NSUserDefaults給做的惫东,用NSDate判斷時間莉给,取七天的間隔判斷登陸狀態(tài)。直到現(xiàn)在了解了keychain廉沮,才知道用NSUserDefaults是非常不安全的颓遏。通常情況下,可以用NSUserDefaults存儲數(shù)據(jù)信息滞时,但是對于一些私密信息叁幢,比如賬號、密碼等等坪稽,就需要使用更為安全的keychain了曼玩。而Keychain的信息是存在于每個應用(app)的沙盒之外的,所以keychain里保存的信息不會因App被刪除而丟失窒百,在用戶重新安裝App后依然有效黍判,數(shù)據(jù)還在。

KeyChain

話不多說贝咙,咱們直接來看怎么快速集成keychain样悟。

  1. 自定義一個類拂募,取名XXXKeyChain庭猩,如下:
#import <Foundation/Foundation.h>
#import <Security/Security.h>
#define KEY_PASSWORD  @"com.rry.app.password"
#define KEY_USERNAME_PASSWORD  @"com.rry.app.usernamepassword"
@interface RRYKeyChain : NSObject
+ (void)save:(NSString *)service data:(id)data;
+ (id)load:(NSString *)service;
+ (void)delete:(NSString *)service;
@end

以上代碼自定義了三個方法,存陈症、取蔼水、刪。并且定義了幾個字符串用來做key录肯。當然趴腋,想使用keychain請不要忘記引入Security包,引入文件 #import <Security/Security.h>论咏。

  1. 再來看.m文件的具體實現(xiàn)
#import "RRYKeyChain.h"

@implementation RRYKeyChain
+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
    return [NSMutableDictionary dictionaryWithObjectsAndKeys:
            (id)kSecClassGenericPassword,(id)kSecClass,
            service, (id)kSecAttrService,
            service, (id)kSecAttrAccount,
            (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,
            nil];
}

+ (void)save:(NSString *)service data:(id)data {
    //Get search dictionary
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    //Delete old item before add new item
    SecItemDelete((CFDictionaryRef)keychainQuery);
    //Add new object to search dictionary(Attention:the data format)
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];
    //Add item to keychain with the search dictionary
    SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
}

+ (id)load:(NSString *)service {
    id ret = nil;
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    //Configure the search setting
    //Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue
    [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 {
            ret = [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)keyData];
        } @catch (NSException *e) {
            NSLog(@"Unarchive of %@ failed: %@", service, e);
        } @finally {
        }
    }
    if (keyData)
        CFRelease(keyData);
    return ret;
}

+ (void)delete:(NSString *)service {
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    SecItemDelete((CFDictionaryRef)keychainQuery);
}

然后就是存优炬,其中mmm是要存的密碼字符串。

NSMutableDictionary *usernamepasswordKVPairs = [NSMutableDictionary dictionary];
[usernamepasswordKVPairs setObject:mmm forKey:KEY_PASSWORD];
[RRYKeyChain save:KEY_USERNAME_PASSWORD data:usernamepasswordKVPairs];

NSMutableDictionary *usernamepasswordKVPairs = (NSMutableDictionary *)[RRYKeyChain load:KEY_USERNAME_PASSWORD];

NSLog(@"%@",[usernamepasswordKVPairs objectForKey:KEY_PASSWORD]);

[RRYKeyChain delete:KEY_USERNAME_PASSWORD];

這樣一個簡單的使用keychain快速存儲密碼的功能就做好了厅贪。


2016.3.23最新更新

話不多說蠢护,直接上代碼,首先是.h

#import <Foundation/Foundation.h>
#import <Security/Security.h>

@interface RHKeyChain : NSObject

+ (void)rhKeyChainSave:(NSString *)service;

+ (NSString *)rhKeyChainLoad;

+ (void)rhKeyChainDelete:(NSString *)service;

@end

只對外提供三個方法养涮,存葵硕、取眉抬、刪,實現(xiàn)放在內部懈凹,再是.m

static NSString * const kRHDictionaryKey = @"com.xxxx.dictionaryKey";
static NSString * const kRHKeyChainKey = @"com.xxxx.keychainKey";

+ (void)rhKeyChainSave:(NSString *)service {
    NSMutableDictionary *tempDic = [NSMutableDictionary dictionary];
    [tempDic setObject:service forKey:kRHDictionaryKey];
    [self save:kRHKeyChainKey data:tempDic];
}

+ (NSString *)rhKeyChainLoad{
    NSMutableDictionary *tempDic = (NSMutableDictionary *)[self load:kRHKeyChainKey];
    return [tempDic objectForKey:kRHDictionaryKey];
}

+ (void)rhKeyChainDelete{
    [self delete:kRHKeyChainKey];
}

三個方法的實現(xiàn)蜀变。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市介评,隨后出現(xiàn)的幾起案子库北,更是在濱河造成了極大的恐慌,老刑警劉巖威沫,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贤惯,死亡現(xiàn)場離奇詭異,居然都是意外死亡棒掠,警方通過查閱死者的電腦和手機孵构,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烟很,“玉大人颈墅,你說我怎么就攤上這事∥砀ぃ” “怎么了恤筛?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芹橡。 經常有香客問我毒坛,道長,這世上最難降的妖魔是什么林说? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任煎殷,我火速辦了婚禮,結果婚禮上腿箩,老公的妹妹穿的比我還像新娘豪直。我一直安慰自己,他們只是感情好珠移,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布弓乙。 她就那樣靜靜地躺著,像睡著了一般钧惧。 火紅的嫁衣襯著肌膚如雪暇韧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天浓瞪,我揣著相機與錄音懈玻,去河邊找鬼。 笑死追逮,一個胖子當著我的面吹牛酪刀,可吹牛的內容都是我干的粹舵。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼骂倘,長吁一口氣:“原來是場噩夢啊……” “哼眼滤!你這毒婦竟也來了?” 一聲冷哼從身側響起历涝,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤诅需,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后荧库,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堰塌,經...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年分衫,在試婚紗的時候發(fā)現(xiàn)自己被綠了场刑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡蚪战,死狀恐怖牵现,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情邀桑,我是刑警寧澤瞎疼,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站壁畸,受9級特大地震影響贼急,放射性物質發(fā)生泄漏。R本人自食惡果不足惜捏萍,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一太抓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧照弥,春花似錦腻异、人聲如沸进副。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽影斑。三九已至给赞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間矫户,已是汗流浹背片迅。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留皆辽,地道東北人柑蛇。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓芥挣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耻台。 傳聞我的和親對象是個殘疾皇子空免,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,334評論 25 707
  • keychain app官方鏈接 重要的事情說三遍 使用keychain group的時候,測試一定要使用真機盆耽! ...
    Rxiaobing閱讀 3,210評論 1 5
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫蹋砚、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,124評論 4 61
  • 余額寶最近又有新動作啦!余額寶基金管理人的天弘基金析恢,近日已發(fā)布公告稱:自8月14日零點起墨坚,個人持有余額寶的最高額度...
    好車貸理財君閱讀 275評論 0 1
  • 新來的同事,第一眼看過去就有一種很熟悉的感覺映挂。讓我下意識的對其很親近框杜,各種能夠幫到的事情不留余力的提供。今天猛然想...
    學道之人閱讀 273評論 0 0