iOS keychain:设置和获取钥匙串数据时的奇怪行为

时间:2013-12-07 15:05:08

标签: ios objective-c wrapper keychain

这一切都发生在我的模拟器中。 在练习使用钥匙扣包装的同时,我发现自己处于一种奇怪的境地。我试图学习如何从钥匙串中插入和检索数据,为了做到这一点,我开始了一个新项目,其中我唯一做的就是写在“(void)viewDidLoad” ViewController 的方法<默认用户名,默认密码,存储并尝试在我的应用程序的第二次运行时检索它们

这应该是小菜一碟,但我发现我的应用程序崩溃了。这是我使用的代码:

- (void)viewDidLoad{

[super viewDidLoad];

//Keychain wrapper definition
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil];

//Getting DATA:
NSLog(@"Retrieving User DATA");
password = [keychainItem objectForKey:(__bridge id)(kSecValueData)];
username = [keychainItem objectForKey:(__bridge id)(kSecAttrAccount)];
NSLog(@"pwd = %@",password);
NSLog(@"user = %@",username);

//Setting DATA:
[keychainItem setObject:@"password you are saving" forKey:(__bridge id)(kSecValueData)];
[keychainItem setObject:@"username you are saving" forKey:(__bridge id)(kSecAttrAccount)];  
}

Xcode给了我一个 NSInternalInconsistencyException 未被捕获。 玩弄代码我意识到只有在设置新密码时(在我的应用程序的第一次运行或重置钥匙串之后)才会出现问题,而这里出现了奇怪的部分,只有在我在用户名之前设置了密码。所以重写代码交换

//Setting DATA
[keychainItem setObject:@"username you are saving" forKey:(__bridge id)(kSecAttrAccount)];
[keychainItem setObject:@"password you are saving" forKey:(__bridge id)(kSecValueData)];     
}  

解决了我的问题。谁能解释我为什么?

最后,我想询问在我的应用程序的第二次运行中检索密码是否会导致其加密版本。这是因为我试图以两种方式获取我的密码:

1)我把它存放后就把它弄好了

//saving DATA
[keychainItem setObject:@"username you are saving" forKey:(__bridge id)(kSecAttrAccount)];
[keychainItem setObject:@"password you are saving" forKey:(__bridge id)(kSecValueData)];

//getting DATA:
username = [keychainItem objectForKey:(__bridge id)(kSecAttrAccount)];
password = [keychainItem objectForKey:(__bridge id)(kSecValueData)];
NSLog(@"\nUser: %@ \nPassword: %@",username,password);  

结果是

User: username you are saving
Password: password you are saving

2)我在第二次运行中获得了密码,将设置部分置于评论

之下
//saving DATA
//[keychainItem setObject:@"username you are saving" forKey:(__bridge id)(kSecAttrAccount)];
//[keychainItem setObject:@"password you are saving" forKey:(__bridge id)(kSecValueData)];

//getting DATA:
username = [keychainItem objectForKey:(__bridge id)(kSecAttrAccount)];
password = [keychainItem objectForKey:(__bridge id)(kSecValueData)];
NSLog(@"\nUser: %@ \nPassword: %@",username,password);  

结果是

User: username you are saving
Password: <70617373 776f7264 20796f75 20617265 20736176 696e67>

这是我的密码加密版本或者什么???

谢谢

1 个答案:

答案 0 :(得分:1)

我还不明白为什么在用户名导致应用程序崩溃之前将密码放入Keychain,但我了解到,为了获得密码钥匙串返回,您必须先将其存储在 NSData 中,您应该这样做:

NSData *pwd = [keychainItem objectForKey:(__bridge id)(kSecValueData)]; 
password =    [[NSString alloc] initWithData:pwd encoding:NSUTF8StringEncoding];