Пригодность scrypt для аутентификации по паролю в браузере с использованием Dart

Я написал сервер Go с настраиваемым двоичным протоколом websocket и клиентом Dart. Аутентификация пользователя на сервере использует scrypt и рекомендуемые параметры N=16384, r=8, p=1 (с солью длины 16 и длиной сгенерированного ключа 64), моему рабочему столу i7 может потребоваться секунда или две для запуска аутентификации на на стороне сервера. Это по сравнению с практически мгновенной, скажем, аутентификацией SHA-512.

У меня были проблемы с поиском реализаций scrypt для Dart, и хотя эта программа работает, генерация того же хеша с теми же параметрами в браузере (Firefox) занимает слишком много времени, чтобы его практически завершить. Я могу довести его до нескольких секунд на той же машине, используя N=1024 и r<=8, но если я остановлюсь на этом для совместимости, на стороне сервера, время аутентификации для практических целей снова станет мгновенным.

Scrypt отлично работает на стороне сервера, но мне интересно, практично ли это для клиента браузера. По общему признанию я не видел / много примеров людей, использующих scrypt для аутентификации браузера. Должен ли я продолжать и заниматься производительностью (например, возможно, используя другие библиотеки javascript из dart), или это основное ограничение на данный момент? Как низко вы можете свернуть параметры scrypt, прежде чем сможете просто использовать более широко доступные оптимизированные крипто-хэширующие алгоритмы, такие как SHA?

2 ответа

@ maaartinus...

Я никогда не думал о том, чтобы не использовать HTTPS. Мне любопытно, имеет ли смысл перекладывать накладные расходы на получение ключей на основе пароля клиенту.

Если я могу, я могу прийти к этой проблеме не из Интернета и вернуться к случаю использования браузера. Когда-то, когда я работал со стандартами безопасности EFT*POS и работал с безопасными коммуникациями для финансовых транзакций. Например; автомат для кредитных карт в супермаркете. Просто установите мое обоснование на эту тему. Тем не менее, я думаю, что первоначальный вопрос должен быть всеобъемлющим. Я решил добавить комментарий, чтобы обогатить разговор на эту тему (это довольно актуально).

Процедура о разговоре между терминалом (iPhone, смартфон, браузер и т. Д.). Предпосылка: вы, естественно, не хотите, чтобы кто-то нюхал ваше имя пользователя и пароль. Предположим, вы работаете с типичной веб-страницей или экраном входа. Через Интранет, LAN, WAN и VPN все, что вы вводите, отправляется с клавиатуры на хост. Эти ссылки уже могут быть зашифрованы в наши дни. WWW-сеть в Интернете имеет два основных варианта: HTTP (открытый текст) и HTTPS (зашифрованный) через браузер. Если мы просто придерживаться пары (имя пользователя, пароль).

Ваш терминал (например, браузер или мобильный) должен быть "доверенным" хостом (сервером, телефонной компанией и т. Д.).

Есть много стандартных вещей, которые вы можете (должны сделать) в первую очередь; и творческий подход оттуда. Думайте об этом как о пирамиде. Внизу находятся вещи, которые вы можете делать на своем ПК. Это основание пирамиды. И есть много полезной информации об этом (например, https://en.wikipedia.org/wiki/Electronic_Frontier_Foundation, EFF), речь идет о защите себя, ваших данных (нематериальной собственности) и ваших прав.

Тем не менее, вот несколько моментов для рассмотрения:

  • Все, отправленное по HTTP, является открытым текстом. Это можно прочитать и скопировать.
    • Хеш, отправленный поверх открытого текста, может быть декодирован для получения пароля. Это просто математика.
    • Даже если вы используете scrypt или другой метод, хеш можно декодировать - достаточно времени.
    • Если вы находитесь в сети, любой хэш, реализованный в браузере (терминал / клиент), прозрачен для всех, кто может загрузить веб-страницу и код JavaScript [как указано выше в ntoskrnl.

HTTPS, с другой стороны, отправляет все как хэш. Кроме того, используемый хэш согласовывается уникально для диалога и согласовывается во время завершения сеанса. Это немного " лучше - лучше " хэш для всего Послания.

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

Еще раз, это может быть взломано, если у вас есть достаточно времени и т. Д. Главное, что делает этот вызов сложным, - это время от времени проводить переговоры.

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

HTTPS работает, чтобы отделить замок от ключа прагматично, вовремя и с помощью процесса.

Что бы ни делалось в комнате HTTPS, остается в комнате HTTPS. У вас должен быть ключ, чтобы войти, ковыряться и делать ненужные вещи. Имхо, любая дополнительная безопасность должна рассматриваться ТОЛЬКО в пространстве HTTPS.

Есть методы, чтобы улучшить на этом основании. Я думаю о безопасности как о пирамиде. примерно на 4 или 5 уровней выше базовых соображений, таких как транспортный протокол.

Такие варианты включают...

  • СМС аутентификационный номер на ваш телефон.
  • Что-то вроде ключа или персонализированного ID-ключа.
  • Физическое сообщение, такое как электронная почта или электронная почта с номером аутентификации.
  • все, что вы придумали.

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

Используйте HTTPS. Если вы хэшируете пароль в браузере, а затем отправляете хеш на сервер для сравнения, что может помешать злоумышленнику просто прослушать хешированный пароль и взломать сеанс, отправив тот же хеш сам?

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

По сути, независимо от того, как вы его обрезаете, вы должны использовать HTTPS, чтобы гарантировать, что ваши сообщения не будут перехвачены и никакая атака MITM не имела места. И как только ваше соединение уже защищено по HTTPS, который зашифрован с помощью (минимум) 128-битного ключа и взлома займет больше времени, чем известный возраст юниверса, вы можете просто использовать соединение HTTPS, чтобы отправить свой пароль и делать дополнительное шифрование пароля на стороне клиента, вероятно, не нужно.

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