Получить пароль брелка в зашифрованном формате

Я работаю над приложением для iOS, которое использует Keychain, Security.framework и класс Apple KeychainWrapper для безопасного хранения пароля пользователя в моем приложении.

Приложение позволяет пользователям создавать учетные записи. Когда пользователь создает учетную запись, приложение должно отправить зашифрованную версию пароля пользователя на мой сервер (запрос POST).

Это все работает, но проблема, с которой я сталкиваюсь, заключается в том, что я могу надежно хранить данные и извлекать их, но я не знаю, как мне получить зашифрованную версию моих данных.

Другими словами, допустим, что пользователь создает учетную запись и устанавливает свой пароль "привет". Затем я установил приложение для безопасного хранения этого в цепочке для ключей.

Итак, iOS зашифровывает его и сохраняет в цепочке для ключей. Ради этого вопроса давайте представим, что зашифрованная версия - "h235llo".

Теперь, когда я хочу отправить пароль на мой сервер, я не хочу отправлять "привет". Я хочу отправить "h235llo" (зашифрованная строка). Как получить доступ к зашифрованной строке?

Вот код, который я использую для доступа к цепочке для ключей:

Чтобы безопасно хранить имя пользователя / пароль в связке ключей, я делаю это:

KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"UserLoginData" accessGroup:nil];
[keychain setObject:_username.text forKey:(__bridge id)kSecAttrAccount];
[keychain setObject:_password.text forKey:(__bridge id)kSecValueData];

И для безопасного извлечения имени пользователя / пароля из цепочки для ключей я делаю это:

NSString *secureUser = [keychain objectForKey:(__bridge id)kSecAttrAccount];
NSString *securePass = [keychain objectForKey:(__bridge id)kSecValueData];

Любая помощь в этом вопросе будет высоко ценится.

Спасибо за ваше время, Дэн.

2 ответа

Решение

Детали внутреннего шифрования Keychain являются частными и могут быть изменены. (Они не являются полностью частными. Apple довольно неплохо объясняет их, но конкретные детали недоступны для приложений.)

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

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

Если вы управляете сервером, и вы просто ищете хороший способ аутентификации без отправки открытого текста, то поздравляю, вы хорошо об этом думаете. Инструмент, который вы хотите, не является, однако, шифрованием. Это функция получения ключа, такая как PBKDF2. Вы можете найти вступление в этом выступлении Renaissance.io, которое начинается на 16-й минуте. Или вы можете начать на слайде 33.

Вам нужно сгенерировать односторонний хэш пароля. Это то, что вы храните и отправляете на сервер.

Вы бы попросили сервер для соли для этого пользователя.

Другие вопросы по тегам