iOS-Schlüsselbund
Ich bin mit dem SSKeyChain Bibliothek zu speichern und den Zugriff auf ein Passwort in der keychain. Ich Teste in den iPhone Simulator und ich kann schreiben, und der Zugriff auf den Schlüsselbund. Aber wenn ich die app (Doppelklick auf home-button, swipe app-up, so ist es nicht mehr im hintergrund) kann ich nicht auf die Daten im Schlüsselbund. Mein Verständnis war, dass, sofern nicht ausdrücklich gelöscht diese Daten würden dort bleiben. Bin ich falsch, oder ist es möglich, ich bin nicht die Speicherung der Daten richtig?
Eine zweite Frage ist, sollten diese Daten verschlüsselt werden oder nicht Schlüsselanhänger kümmert das schon? Wenn es verschlüsselt werden soll irgendwelche Vorschläge, wie?
Hier ist mein code:
- (void)viewDidLoad
{
[super viewDidLoad];
/*
Let sskeychain know how the keychain values can be accessed - these are the options:
kSecAttrAccessibleWhenUnlocked Only accessible when device is unlocked.
kSecAttrAccessibleAfterFirstUnlock Accessible while locked. But if the device is restarted it must first be unlocked for data to be accessible again.
kSecAttrAccessibleAlways Always accessible.
kSecAttrAccessibleWhenUnlockedThisDeviceOnly Only accessible when device is unlocked. Data is not migrated via backups.
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly Accessible while locked. But if the device is restarted it must first be unlocked for data to be accessible again. Data is not migrated via backups.
kSecAttrAccessibleAlwaysThisDeviceOnly Always accessible. Data is not migrated via backups.
*/
[SSKeychain setAccessibilityType:kSecAttrAccessibleWhenUnlocked];
txtUserName = [[UITextField alloc] initWithFrame:CGRectMake((self.view.frame.size.width/2)-100.0, 200.0, 200.0, 30.0)];
txtUserName.placeholder = @"User Name";
txtUserName.font = [UIFont fontWithName:@"Avenir" size:18.0];
txtUserName.layer.cornerRadius = 8.0f;
txtUserName.backgroundColor = [UIColor whiteColor];
txtUserName.layer.borderWidth = 1.0;
[self.view addSubview:txtUserName];
txtSignon = [[UITextField alloc] initWithFrame:CGRectMake((self.view.frame.size.width/2)-100.0, txtUserName.frame.origin.y + txtUserName.frame.size.height + 20.0, 200.0, 30.0)];
txtSignon.placeholder = @"Password";
txtSignon.font = [UIFont fontWithName:@"Avenir" size:18.0];
txtSignon.layer.cornerRadius = 8.0f;
txtSignon.backgroundColor = [UIColor whiteColor];
txtSignon.layer.borderWidth = 1.0;
txtSignon.secureTextEntry = YES;
[self.view addSubview:txtSignon];
UIButton* btnSubmit = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btnSubmit setTitle:@"Submit" forState:UIControlStateNormal];
[btnSubmit addTarget:self action:@selector(storeValues:) forControlEvents:UIControlEventTouchUpInside];
[btnSubmit setFrame:CGRectMake((self.view.frame.size.width/2)-100, txtSignon.frame.origin.y + txtSignon.frame.size.height + 20.0, 200.0, 30.0)];
[self.view addSubview:btnSubmit];
UIButton* btnGetData = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btnGetData setTitle:@"Get Stored Credentials" forState:UIControlStateNormal];
[btnGetData addTarget:self action:@selector(getStoredValues:) forControlEvents:UIControlEventTouchUpInside];
[btnGetData setFrame:CGRectMake((self.view.frame.size.width/2)-100, btnSubmit.frame.origin.y + btnSubmit.frame.size.height + 20.0, 200.0, 30.0)];
[self.view addSubview:btnGetData];
}
- (void) storeValues : (UIButton*) myButton {
[self.view endEditing:YES];
//get the saved values
NSString* strUserName = txtUserName.text;
NSString* strUserPass = txtSignon.text;
self.strStoredUserName = strUserName;
//pass them along to the keychain
[SSKeychain setPassword:strUserPass forService:@"com.sanofi.us" account:strUserName];
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Success" message:@"Your user name and password were stored in the devices keychain!" delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil];
[alert show];
txtUserName.text = @"";
txtSignon.text = @"";
}
- (void) getStoredValues : (UIButton*) myButton {
NSString* strUserName = self.strStoredUserName;
//Access that token when needed
NSString* strPassword = [SSKeychain passwordForService:@"com.sanofi.us" account:strUserName];
if (strPassword) {
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Success" message:[NSString stringWithFormat:@"Your credentials stored in the keychain are:\nUsername: %@\nPassword: %@", strUserName, strPassword] delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil];
[alert show];
}
}
- 1. Ja die Daten zugegriffen, auch nach der Neuinstallation der app. 2. gehen Sie zum Beispiel yogeshlolusareapple.blog.com/2014/09/01/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht dieser code korrekt ist, und die Daten sein sollten, kleben herum, es sei denn der simulator wird zurückgesetzt. Sind Sie in der Lage zu testen, die auf einem Gerät?
Antwort auf die zweite Frage, je nach Gerät und iOS-version der keychain-Passwörter sind entweder verschlüsselt (3DES oder AES, aber die genaue Umsetzung kann sich in Zukunft ändern.
Für Swift, die Sie verwenden können,KeychainAccess, das ist ein bisschen einfacher zu verwenden:
Entsprechend der aktuelle iOS-11-Sicherheits-guide keychain-Elemente sind verschlüsselt mit AES-128.