6
我想在App中保存用户的ID和密码。如何使用钥匙串保存密码,如GenericKeychain示例代码
当我保存ID和密码时,什么是值得推荐的加密方式。
我从越狱或黑客找到更安全的方式。
GenericKeychain示例代码如何?
我不能有关于安全的信心如何使用钥匙扣像GenericKeychain示例代码。
请告诉我一些建议。谢谢^^ *
我想在App中保存用户的ID和密码。如何使用钥匙串保存密码,如GenericKeychain示例代码
当我保存ID和密码时,什么是值得推荐的加密方式。
我从越狱或黑客找到更安全的方式。
GenericKeychain示例代码如何?
我不能有关于安全的信心如何使用钥匙扣像GenericKeychain示例代码。
请告诉我一些建议。谢谢^^ *
您可以使用安全框架
#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];
}
现在,您需要使用__bridge(让自动链接地址为你做它)在上面ObjC和C代码之间施放。 – 2013-01-30 04:36:03
请问您可以更新此ARC吗? – 2014-08-21 23:05:42
你需要在SecItemCopyMatching之后检查err == errSecItemNotFound – 2016-03-09 11:25:13