如何使用钥匙串保存像GenericKeychain示例代码的密码
我想在App中保存用户的ID和密码。
保存身份和密码时推荐的encryption方式是什么?
我从越狱或黑客find更安全的方法。
GenericKeychain示例代码如何?
http://developer.apple.com/library/ios/#samplecode/GenericKeychain/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007797
我不能有安全的如GenericKeychain示例代码如何使用钥匙链的信心。
请告诉我一些build议。 谢谢^^ *
您可以使用安全框架
#import <Security/Security.h>
要保存服务器的用户名和密码:
-(void) saveUsername:(NSString*)user withPassword:(NSString*)pass forServer:(NSString*)server { // Create dictionary of search parameters NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, server, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, nil]; // Remove any old values from the keychain OSStatus err = SecItemDelete((__bridge CFDictionaryRef) dict); // Create dictionary of parameters to add NSData* passwordData = [pass dataUsingEncoding:NSUTF8StringEncoding]; dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, server, kSecAttrServer, passwordData, kSecValueData, user, kSecAttrAccount, nil]; // Try to save to keychain err = SecItemAdd((__bridge CFDictionaryRef) dict, NULL); }
去除:
-(void) removeAllCredentialsForServer:(NSString*)server { // Create dictionary of search parameters NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, server, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, kCFBooleanTrue, kSecReturnData, nil]; // Remove any old values from the keychain OSStatus err = SecItemDelete((__bridge CFDictionaryRef) dict); }
读书:
-(void) getCredentialsForServer:(NSString*)server { // Create dictionary of search parameters NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, server, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, kCFBooleanTrue, kSecReturnData, nil]; // Look up server in the keychain NSDictionary* found = nil; CFDictionaryRef foundCF; OSStatus err = SecItemCopyMatching((__bridge CFDictionaryRef) dict, (CFTypeRef*)&foundCF); // Check if found found = (__bridge NSDictionary*)(foundCF); if (!found) return; // Found NSString* user = (NSString*) [found objectForKey:(__bridge id)(kSecAttrAccount)]; NSString* pass = [[NSString alloc] initWithData:[found objectForKey:(__bridge id)(kSecValueData)] encoding:NSUTF8StringEncoding]; }