2013-04-07 7 views
1

Я пишу код, где пользователь подписывается для учетной записи с паролем электронной почты +. Я хотел бы иметь учетные данные, хранящиеся в приложении IOS, а затем использовать для всех удаленных действий, которые делает пользователь (создать заказ, обновить информацию об учетной записи и т. Д.).Какой самый безопасный способ создать приложение «всегда регистрируемое» IOS?

Безопасно ли хранить пароль в цепочке ключей IOS с использованием PDKeychainBindings, а затем отправлять пользователю/передавать по HTTPS для каждого запроса на серверы?

Есть ли лучший/безопасный способ?

ответ

4

Самого безопасным способ не сохраняет пароль. Обычно при первом подключении вы меняете имя пользователя & пароль для постоянного токена авторизации.

Затем вы сохраняете этот токен в цепочке ключей, а все остальные запросы на сервер разрешены только токеном. Вы просите пользователя снова ввести пароль, только если токен становится недействительным. (он постоянный, поэтому он не должен истекать, но он может быть недействителен сервером).

+1

Это намного лучше, чем сохранение пароля в Keychain. –

+0

Султан, спасибо за ответ. Какая часть небезопасна? Хранение пароля в цепочке ключей? Или отправить пароль через HTTPS для каждого действия? Для хранения токена в цепочке ключей, не так ли, чтобы хранить пароль? Если кто-то получил ловушку токена, они не могли бы это использовать? Разница в том, что токен легко отменяется? – BigCheesy

+0

@BigCheesy Отправка пароля для каждого действия опасна. Вы всегда должны использовать какой-то токен. Обычно токены истекают (1 час или около того). Мобильные приложения часто используют постоянные токены. Это легко revokable (пользователь не должен менять пароль). И сохранение пароля пользователя никогда не будет безопасным. Особенно на устройствах, которые можно легко украсть. – Sulthan

4

Есть два способа:

1) Вы можете использовать KeyChain: http://developer.apple.com/library/ios/#documentation/Security/Conceptual/keychainServConcepts/iPhoneTasks/iPhoneTasks.html

Пример:

//Initializing 
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAppLogin" accessGroup:nil]; 
//Saving 
[keychainItem setObject:@"password you are saving" forKey:kSecValueData]; 
[keychainItem setObject:@"username you are saving" forKey:kSecAttrAccount]; 
//Getting 
NSString *password = [keychainItem objectForKey:kSecValueData]; 
NSString *username = [keychainItem objectForKey:kSecAttrAccount]; 
//deleting 
[keychainItem resetKeychainItem]; 

2) Вы можете использовать NSUserDefaults

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
NSString *pword = [prefs setObject:@"yourpassword" ForKey:@"password"]; 
NSString *username = [prefs setObject:@"username" ForKey:@"username"]; 
[prefs synchronize]; 
//getting 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
NSString *pword = [prefs objectForKey:@"password"]; 
NSString *username = [prefs objectForKey:@"username"]; 

Метод 1 является более безопасный, чем метод 2. Вы можете сделать метод 2 более безопасным, зашифровав свой пароль меч и имя пользователя.

Надеется, что это помогает ..

+1

Метод 2 не является безопасным вообще, 'NSUserDefaults' являются всего лишь plist. Кто-то ворует ваше устройство, делает резервную копию и имеет все пароли в хорошем XML-файле. Шифрование возможно только в том случае, если вы можете поместить ключ шифрования где-нибудь, поэтому при шифровании метод 2 станет методом 1, только более сложным. – Sulthan

+0

Спасибо за ответ, озер. Однако я не просил реализации брелка. Скорее, я спрашивал, безопасно ли хранить пароль в цепочке ключей, и если безопасно постоянно отправлять пароль через HTTPS для каждого действия. – BigCheesy

Смежные вопросы