Какова стандартная процедура, используемая для систем входа в iOS-приложения?
Я создаю приложение и веб-сайт для проекта, который у меня есть, но я не уверен, что делать с логином. Это не "я - нубо, а я хочу приложение с логином" - вопрос. Я несколько опытен как в области веб-, так и для баз данных и приложений, но на самом деле я никогда не затрагивал предмет безопасности, кроме шаблонов приложений.
То, что я представляю, - это "простая" система входа в систему, такая как Skype, Facebook, NetFlix, действительно любое приложение, к которому вы можете войти в систему, в котором также есть веб-сайт для входа в систему.
Часть моего вопроса касается безопасности процесса. Моя первоначальная мысль состоит в том, что пароль в чистом тексте никогда не должен быть отправлен через Интернет, что заставляет меня думать, что пароли должны быть хэшированы/зашифрованы на телефоне, а также на веб-сайте при входе в систему. хэширования/шифрования времени раньше, но просто используя sha1
и md5
для "преобразования" текста. Каков правильный способ сделать это? С моими текущими знаниями я предполагаю, что если я использую md5
для шифрования пароля, любой может также расшифровать его с помощью md5
, но я мог бы использовать SALT
(?) Или некоторую форму для изменения ключа. Это то, как это делают "большие мальчики", или есть секретный проход, о котором я не знаю?
Теперь на реальный вопрос. Как я должен безопасно хранить логин?
То, что я пробовал: при создании "тестового проекта" в Xcode для этого я просто создал класс User
с полем для username
. Когда "входе", введя имя пользователя и пароль, я просто отправил POST
-method HTTP-request
на мою .php
-страницу, которая просто выполнила SELECT * FROM User WHERE Username = '$_POST['username']' AND Password = '$_POST['password']';
. Если база данных вернула одну строку, тогда пароль был правильно, и страница может распечатать пользователя в JSON или что угодно. Когда устройство получило успешный вход в систему, я преобразовал пользовательский объект в приложение, теперь содержащий имя пользователя (и потенциально UserID, E-mail, адрес и т.д.) До NSData*
и используя NSKeyedArchiver
и NSKeyedUnarchiver
, чтобы сохранять и загружать пользователя, а не снова проверять подлинность. Если пользователь нажимает "Выход", я протираю этот "архив". Это работает, но я чувствую, что это не особенно безопасный способ сделать это. Если да, то почему именно это?
(Наш back-end в настоящее время является Google App Engine (java), который поддерживает OAuth. Некоторые рекомендуют это, но мы не можем найти подходящую документацию, которая имеет смысл для нашего плана с пользовательскими пользователями)
Ответы
Ответ 1
Передача паролей
Простым способом обеспечения безопасности является просто отправлять пароли через SSL. Если вы настроили SSL-сертификат и выполняете всю свою аутентификацию по https, вся обратная и прямая связь зашифровывается транспортным уровнем. Примечание. md5
не является алгоритмом шифрования, это слабый алгоритм хеширования - не используйте его для обеспечения безопасности.
Сохранение логинов
Ваши пароли должны храниться в базе данных как соленый хеш (случайная соль с устойчивой к столкновению хэш-функцией, такой как SHA256). Не храните текстовую версию пароля в любом месте. Если вы используете PHP на стороне сервера, вы можете использовать новую функцию password_hash()
или crypt()
для генерации и сравнения ваших соленых хэшей.
Если вы надежно передаете SSL, вы должны просто использовать возможности сеанса вашего веб-сервера для отслеживания логинов (например, $_SESSION['user_id'] = ...
).
Ответ 2
Если вы хотите безопасно хранить свое имя пользователя/адрес электронной почты или адрес или что-то еще, то встроенный keychain единственный счастливый способ Apple.
Посмотрите SSKeychain (или PDKeychain или UICKeychain) и расширьте его, чтобы включить каждое свойство, которое вы хотите сохранить. Как правило, он использовался для хранения комбинаций имени пользователя и пароля, но может быть расширен для безопасного хранения произвольных данных.
Что касается передачи защищенных данных на ваш сервер, сделайте это через HTTPS.
Я могу привести примеры, если вы хотите.
Ответ 3
Другой вариант - добавить какой-то процесс входа в систему OAuth или XAuth.
Таким образом, вы не храните пароли, а только так называемые "токены". Токены истекают и могут быть отменены.
Не сохранять имя пользователя и пароль вообще - лучший способ их защитить.
Алекс