2014-04-30 126 views
0

我正在使用SSKeyChain庫來存儲和訪問鑰匙串中的密碼。我正在iPhone模擬器中測試,我可以編寫和訪問鑰匙串。但是,當我關閉應用程序(雙擊主頁按鈕,向上滑動應用程序,所以它不再在後臺)我無法訪問鑰匙串中的數據。我的理解是,除非明確刪除,否則這些數據將保留在那裏。我錯了,還是有可能我沒有妥善保存數據?iOS鑰匙串訪問

第二個問題是,這個數據應該加密還是鑰匙串已經處理了?如果應該加密的話,有什麼建議?

這裏是我的代碼:

- (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]; 
    } 

} 
+0

1.是的,即使重新安裝應用程序後,數據仍然可以訪問。 2.舉例http://yogeshlolusareapple.blog.com/2014/09/01/key-chain-values-saving-and-retrieving-data/ –

回答

0

此代碼看起來是正確的,數據應,除非模擬器正在復位貼敷左右。你能夠在設備上測試嗎?

要回答第二個問題,根據您的設備和iOS版本,鑰匙串密碼或者使用3DES或AES進行加密,但確切的實施可能會在將來發生變化。