Как зашифровать пароль, путешествующий по TCP? - PullRequest
0 голосов
/ 08 сентября 2011

В моем игровом приложении, запущенном с iPhone / iPad на центральный сервер, которым я управляю через TCP, мне нужно отправить информацию для входа.

В настоящее время я отправляю код операции LOGIN с байтами ascii для входа в систему.и пароль в открытом виде.Я не хочу отправлять пароли пользователей в открытом виде - например, они могут быть подключены к Wi-Fi.

Как я могу обработать шифрование этого?Вот мои требования:

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

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

Ответы [ 3 ]

4 голосов
/ 09 сентября 2011

Во-первых, обязательно: «Не придумывайте свою собственную схему паролей. Если вы не эксперт, вы сделаете это неправильно. Если вы эксперт, вы сделаете это неправильно творческим путем, который ужасно сломанный, но который будет невидимым, пока ваша схема не будет использована тысячами "

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

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

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

Давайте предположим, что криптографически безопасный хэш не является криптографией (и я не знаю, так ли это или нет, но это не соответствует ограничениям на экспорт США, насколько я читал). Мое предложение было бы очень простым протоколом «запрос-ответ», который можно использовать для проверки того, что у пользователя есть пароль (я рекомендую вам посмотреть «протокол вызов-ответ» онлайн).

Одно предостережение: я не обращаюсь к получению пароля на сервер; просто сервер, проверяющий, что пользователь имеет правильный пароль для учетной записи. Думайте об этом как об общем понимании того, как вы могли бы предотвратить такие вещи, как атаки воспроизведения, и сделать жизнь злоумышленников, которые могут видеть поток данных, более сложной:

Клиент: «Я хочу аутентифицироваться как Джон Смит»

Сервер: «Хорошо,« Джон Смит », заявитель, возьмите текущую дату и время (2011-09-09 @ 12: 04: 33AM) и случайное число, которое я только что придумал: 4bazillion, и хешируйте его с помощью ваш пароль. Дайте мне знать, что вы получили. "

Клиент:

  • запрашивает у пользователя пароль
  • хэши
  • Говорит: «Я получил: gaAGRtcq4qt22332.»

Сервер:

  • принимает дату и время и случайное число и хэши с паролем
  • сравнивает данные клиента с расчетными данными
  • Если есть совпадение:
    • Говорит: "Хорошо, ты внутри."
  • В противном случае:
    • Говорит: «Иди, колоть песок».
2 голосов
/ 08 сентября 2011

Аутентификация с вашим сервисом через HTTP. Вам не нужно будет использовать какие-либо сторонние библиотеки. Вы можете реализовать это как сообщение или получить.

2 голосов
/ 08 сентября 2011

TLS / SSL.Просто используйте это.Он встроен в iOS.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...