如何使用钥匙串保存像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]; }