iOS的keychain服務提供了一種安全的保存私密信息(密碼,序列號,證書等)的方式,每一個ios程序都有一個獨立的keychain存儲。相對於NSUserDefaults、文件保存等通常方式,keychain保存更爲安全,並且keychain裏保存的信息不會因App被刪除而丟失,因此在重裝App後,keychain裏的數據還能使用。從ios 3。0開始,跨程序分享keychain變得可行。ios
如何須要在應用裏使用使用keyChain,咱們須要導入Security.framework ,keychain的操做接口聲明在頭文件SecItem.h裏。直接使用SecItem.h裏方法操做keychain,須要寫的代碼較爲複雜。git
直接上代碼。github
/* 獲取程序惟一標示碼 */ + (NSString *)getUniqueIdentifierCodeForCustom { NSString *unidcode = [CommonUtils getInfoObject:@"UniqueIdentifierCode"]; if ([CommonUtils isEmpty:unidcode]) { /** 初始化一個保存用戶賬號的KeychainItemWrapper */ KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Password" accessGroup:nil]; // 從keychain裏取出賬號密碼 id secAttr = [CommonUtils secAttrForSection:0]; unidcode = [wrapper objectForKey:secAttr]; if ([CommonUtils isEmpty:unidcode]) { unidcode = [CommonUtils createUUID]; //保存密碼 [wrapper setObject:unidcode forKey:secAttr]; } [CommonUtils setInfoObject:unidcode forKey:@"UniqueIdentifierCode"]; } return unidcode; }
// 獲取一個UUID字符串 + (NSString *)createUUID { CFUUIDRef uuidObject = CFUUIDCreate(kCFAllocatorDefault); NSString *uuidStr = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, uuidObject)); return uuidStr; }
KeychainItemWrapper和SFHFKeychainUtils是2個較好的工具。安全
KeychainItemWrapper是apple的官方例子GenericKeyChain一個訪問keychain經常使用操做的封裝類,下面是關鍵代碼。app
/** 初始化一個保存用戶賬號的KeychainItemWrapper */ KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Account Number" accessGroup:@"YOUR_APP_ID_HERE.com.yourcompany.AppIdentifier"]; //保存賬號 [wrapper setObject:@"<賬號>" forKey:(id)kSecAttrAccount]; //保存密碼 [wrapper setObject:@"<賬號密碼>" forKey:(id)kSecValueData]; //從keychain裏取出賬號密碼 NSString *password = [wrapper objectForKey:(id)kSecValueData]; //清空設置 [wrapper resetKeychainItem];
SFHFKeychainUtils提供了在ios keychain中安全的存儲密碼工具。框架
下載地址https://github.com/ldandersen/scifihifi-iphone/tree/master/securityiphone
1、引入Security.frameWork框架。工具
2、引入頭文件:SFHKeychainUtils.h.ui
三、存密碼spa
[SFHFKeychainUtils storeUsername:@"dd" andPassword:@"aa"forServiceName:SERVICE_NAME updateExisting:1 error:nil]; [SFHFKeychainUtils deleteItemForUsername:@"dd" andServiceName:SERVICE_NAME error:nil];
四、取密碼
NSString *passWord = [SFHFKeychainUtils getPasswordForUsername:@"dd"andServiceName:SERVICE_NAME error:nil];