2015-06-06 2 views
0

Мне нужно зашифровать пароль в Swift и отправить его на мой веб-сервер для хранения в базе данных. Любые лучшие практики? Я видел AESCrypt.encrypt(userPassword, password: API_AUTH_PASSWORD), но я не уверен, достаточно ли этого (соленый и т. Д.). Кроме того, на самом сервере, как бы мне пойти на сравнение хешированных паролей для аутентификации входа? Я использую PHP. В основном я спрашиваю, существует ли общепринятый метод шифрования в Swift для хеширования и проверки паролей на веб-сервере на основе PHP.iOS - Шифрование паролей в Swift

+0

Вы не расшифровываете данные на сервере. Это плохой план. – rmaddy

ответ

5

См. this question. Вы должны понимать последствие хеширования на стороне клиента:

  • Pro: Вы можете использовать большее количество раундов, создавая сильный хэш.

    Для справки, 1Password использует как минимум 25 000 патронов PBKDF2-HMAC-SHA512. Вероятно, ваши пользователи не будут использовать diceware, поэтому вам, возможно, понадобится более высокий счетчик.

  • Con: Вы запираетесь на определенный алгоритм & округлять кол-во.

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

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

    Использование соли (например, appname + username) должно препятствовать влиянию на любые другие сайты server breach.

    Как упоминается ссылка, вы, вероятно, по-прежнему хотите использовать «быстрый» хэш (например, SHA-512) на сервере. Это ограничивает ущерб, если скомпрометирована только база данных.

    На сервере хеши следует сравнивать в постоянное время с hash_equals. password_compat имеет code для более ранних версий PHP.

    defuse рекомендует использовать случайную соль на стороне сервера при использовании хеширования на стороне клиента.

Альтернативой & более общий сценарий, чтобы сделать все хэширования на сервере.

Для PHP см. password_hash, password_verify и password_needs_rehash.

Если вы используете старую версию PHP, то есть password_compat.

+1

Я делаю это уже, но это означает, что я отправляю пароль в виде обычного текста. Думаю, ответ будет заключаться в том, чтобы защитить сервер с помощью https? –

+2

@itstrueimryan Да, используйте HTTPS. –

+0

Согласитесь, что (быстрое) хеширование на стороне сервера является требованием для клиентской стороны PBKDF2ing, но я не верю, что добавление соли на стороне сервера добавляет любую ценность сверху (требуется со стороны стороны клиента). Я написал исследовательский документ именно по этой теме: [Метод защиты паролей для баз данных для веб-приложений] (https://eprint.iacr.org/2015/387.pdf). Я также ожидаю, что веб-сообщество в будущем будет двигаться к чему-то подобному: у ряда людей были подобные идеи, это просто вопрос анализа и правильное решение! – TheGreatContini

1

Лучшая практика - НЕ хранить пароль в вашей базе данных.

Вы должны выполнить одностороннюю хэш-функцию, такую ​​как SHA, и вместо этого сохранить значение хэша. Когда вам нужно аутентифицировать пользователя, введите хеш введенный пользователем пароль и сравните хешированные значения. Используйте значение соли в ваших хешах для дальнейшего повышения безопасности.

+0

Ну, yeh. Это то, что я имел в виду. Не простой старый пароль. Я хочу сохранить хешированный и соленый пароль. –

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