iOS面試題:你會如何存儲用戶的一些敏感信息授翻,如登錄的token

使用keychain來存儲,也就是鑰匙串,使用keychain需要導(dǎo)入Security框架

iOS的keychain服務(wù)提供了一種安全的保存私密信息(密碼刚梭,序列號重慢,證書等)的方式今阳,每個iOS程序都有一個獨立的keychain存儲师溅。相對于 NSUserDefaults、文件保存等一般方式盾舌,keychain保存更為安全墓臭,而且keychain里保存的信息不會因App被刪除而丟失,所以在 重裝App后妖谴,keychain里的數(shù)據(jù)還能使用窿锉。從iOS 3.0開始,跨程序分享keychain變得可行膝舅。

如何需要在應(yīng)用里使 用使用keyChain嗡载,我們需要導(dǎo)入Security.framework ,keychain的操作接口聲明在頭文件SecItem.h里仍稀。直接使用SecItem.h里方法操作keychain洼滚,需要寫的代碼較為復(fù)雜,為減輕 咱們程序員的開發(fā)技潘,我們可以使用一些已經(jīng)封裝好了的工具類遥巴,下面我會簡單介紹下我用過的兩個工具類:KeychainItemWrapper和 SFHFKeychainUtils千康。

自定義一個keychain的類

  • CSKeyChain.h
@interface CSKeyChain : NSObject

+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service;

+ (void)save:(NSString *)service data:(id)data;

+ (id)load:(NSString *)service;

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

@end
  • CSKeyChain.m
#import "CSKeyChain.h"
#import<Security/Security.h>

@implementation CSKeyChain

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

+ (void)save:(NSString *)service data:(id)data {
    // 獲得搜索字典
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    // 添加新的刪除舊的
    SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
    // 添加新的對象到字符串
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData];
    // 查詢鑰匙串
    SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL);
}

+ (id)load:(NSString *)service {
    id ret = nil;
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    // 配置搜索設(shè)置
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData];
    [keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit];
    
    CFDataRef keyData = NULL;
    
    if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
        @try {
            ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData];
        } @catch (NSException *e) {
            NSLog(@"Unarchive of %@ failed: %@", service, e);
        } @finally {
        }
    }
    
    return ret;
}

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

@end
  • 在別的類實現(xiàn)存儲,加載,刪除敏感信息方法
// 用來標(biāo)識這個鑰匙串
static NSString * const KEY_IN_KEYCHAIN = @"com.cs.app.allinfo";
// 用來標(biāo)識密碼
static NSString * const KEY_PASSWORD = @"com.cs.app.password";

+ (void)savePassWord:(NSString *)password {
    NSMutableDictionary *passwordDict = [NSMutableDictionary dictionary];
    [passwordDict setObject:password forKey:KEY_PASSWORD];
    [CSKeyChain save:KEY_IN_KEYCHAIN data:passwordDict];
}

+ (id)readPassWord {
    NSMutableDictionary *passwordDict = (NSMutableDictionary *)[CSKeyChain load:KEY_IN_KEYCHAIN];
    return [passwordDict objectForKey:KEY_PASSWORD];
}

+ (void)deletePassWord {
    [CSKeyChain delete:KEY_IN_KEYCHAIN];
}

更多:iOS面試題合集

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市挪哄,隨后出現(xiàn)的幾起案子吧秕,更是在濱河造成了極大的恐慌,老刑警劉巖迹炼,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砸彬,死亡現(xiàn)場離奇詭異,居然都是意外死亡斯入,警方通過查閱死者的電腦和手機(jī)砂碉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刻两,“玉大人增蹭,你說我怎么就攤上這事“跄。” “怎么了滋迈?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長户誓。 經(jīng)常有香客問我饼灿,道長,這世上最難降的妖魔是什么帝美? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任碍彭,我火速辦了婚禮,結(jié)果婚禮上悼潭,老公的妹妹穿的比我還像新娘庇忌。我一直安慰自己,他們只是感情好舰褪,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布皆疹。 她就那樣靜靜地躺著,像睡著了一般占拍。 火紅的嫁衣襯著肌膚如雪墙基。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天刷喜,我揣著相機(jī)與錄音残制,去河邊找鬼。 笑死掖疮,一個胖子當(dāng)著我的面吹牛初茶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼恼布,長吁一口氣:“原來是場噩夢啊……” “哼螺戳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起折汞,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤倔幼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后爽待,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體损同,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年鸟款,在試婚紗的時候發(fā)現(xiàn)自己被綠了膏燃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡何什,死狀恐怖组哩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情处渣,我是刑警寧澤伶贰,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站罐栈,受9級特大地震影響黍衙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悠瞬,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一们豌、第九天 我趴在偏房一處隱蔽的房頂上張望涯捻。 院中可真熱鬧浅妆,春花似錦、人聲如沸障癌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涛浙。三九已至康辑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轿亮,已是汗流浹背疮薇。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留我注,地道東北人按咒。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像但骨,于是被迫代替她去往敵國和親励七。 傳聞我的和親對象是個殘疾皇子智袭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件掠抬、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,094評論 4 62
  • 《愛情怎么了》 文/白傳英 你是否也有過孤單 一個人走在天邊 世界上那么多人 總和你擦肩 你是否也有過愛...
    白清風(fēng)閱讀 223評論 0 1
  • 召喚Linux Linux 本質(zhì)上是個操作系統(tǒng)吼野,和Windows,Mac性質(zhì)一樣 操作靠鍵盤輸入命令行來實現(xiàn) 我們...
    dongkun031閱讀 331評論 1 0
  • 人這一輩子两波,不是只有短短兩三年瞳步。 這么簡單的道理,并不是每個人都明白 雨女,如果公司每天有很多活干谚攒、很多有挑戰(zhàn)的活干,...
    上古天真2018閱讀 166評論 0 0
  • 今天我的收獲還不錯氛堕,但是我心里一直有點堵馏臭,為什么呢感覺自己的私心還是有點重,今天招了一個代理讼稚,發(fā)了一件貨賺了20...
    微笑一生01閱讀 186評論 3 5