学了很久的iOS,一直都是明文保存用户名和密码在本地,手机一般都是自己用的,而且非越狱手机东西也不怎么能拿到数据,所以也就没在乎那么多,当然,这是不科学的。悄悄的说,这块一直不是我写的~~~ 用户隐私信息正常都是加密保存在本地,各种各样的加密方法,大 ...
学了很久的iOS,一直都是明文保存用户名和密码在本地,手机一般都是自己用的,而且非越狱手机东西也不怎么能拿到数据,所以也就没在乎那么多,当然,这是不科学的。悄悄的说,这块一直不是我写的~~~
用户隐私信息正常都是加密保存在本地,各种各样的加密方法,大家自己去找找就好了,今天介绍下keychain。
官方文档介绍如下:
Keychain Services provides secure storage of passwords, keys, certificates, and notes for one or more users. A user can unlock a keychain with a single password, and any Keychain Services–aware application can then use that keychain to store and retrieve passwords。
简单的翻译下,keychain可以存储密码、证书等等,至于有什么好处,呵呵哒,自己百度去吧,总结一点就是更安全,而且取的更方便吧,看app场景吧。
本次代码,分为两段,一段为保存代码
1 - (BOOL)saveData:(NSString *)str 2 { 3 OSStatus status = noErr; 4 NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; 5 [query setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass]; 6 /// query one 7 [query setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit]; 8 [query setObject:@"password" forKey:(id)kSecAttrService]; 9 CFMutableDictionaryRef outDicRef = nil;10 status = SecItemCopyMatching((CFDictionaryRef)query, (CFTypeRef *)&outDicRef);11 if(status==noErr)12 {13 NSLog(@"#######################query success");14 [query removeObjectForKey:(id)kSecMatchLimit];15 NSLog(@"=============code %d",SecItemDelete((CFDictionaryRef)query));16 NSMutableDictionary *dt = [[NSMutableDictionary alloc] init];17 [dt setObject:@"label" forKey:(id)kSecAttrLabel];18 [dt setObject:@"password" forKey:(id)kSecAttrService];19 [dt setObject:[str dataUsingEncoding:NSUTF8StringEncoding] forKey:(id)kSecValueData];20 [dt setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];21 22 [dt setObject:@"Item label" forKey:(__bridge id)kSecAttrLabel];23 24 [dt setObject:@"Item description" forKey:(__bridge id)kSecAttrDescription];25 26 [dt setObject:@"Account" forKey:(__bridge id)kSecAttrAccount];27 28 [dt setObject:@"Service" forKey:(__bridge id)kSecAttrService];29 30 [dt setObject:@"Your comment here." forKey:(__bridge id)kSecAttrComment];31 status = SecItemAdd((CFDictionaryRef)dt, NULL);32 if(status==noErr)33 {34 NSLog(@"#######################save success");35 return YES;36 }37 return YES;38 }39 else40 if(status==errSecItemNotFound)41 {42 NSLog(@"#####################not found");43 //store44 NSMutableDictionary *dt = [[NSMutableDictionary alloc] init];45 [dt setObject:@"label" forKey:(id)kSecAttrLabel];46 [dt setObject:@"password" forKey:(id)kSecAttrService];47 [dt setObject:[str dataUsingEncoding:NSUTF8StringEncoding] forKey:(id)kSecValueData];48 [dt setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];49 50 [dt setObject:@"Item label" forKey:(__bridge id)kSecAttrLabel];51 52 [dt setObject:@"Item description" forKey:(__bridge id)kSecAttrDescription];53 54 [dt setObject:@"Account" forKey:(__bridge id)kSecAttrAccount];55 56 [dt setObject:@"Service" forKey:(__bridge id)kSecAttrService];57 58 [dt setObject:@"Your comment here." forKey:(__bridge id)kSecAttrComment];59 status = SecItemAdd((CFDictionaryRef)dt, NULL);60 if(status==noErr)61 {62 NSLog(@"#######################save success");63 return YES;64 }65 if(outDicRef)66 CFRelease(outDicRef);67 return NO;68 }69 else70 {71 NSLog(@"########################error query %d",status);72 }73 return NO;74 }
原标题:iOS keychain入门
关键词:IOS
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。