Прежде чем мы углубимся в код 🤖, я сначала объясню, что мы в настоящее время используем для предоставления пользователю доступа к ресурсу.

Во-первых, зачем мы это делаем?

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

Аутентификация

Аутентификация - это механизм, который подтверждает личность пользователей, пытающихся получить доступ к системе. Чтобы пользователям был предоставлен доступ к ресурсу, они должны сначала доказать, что они те, кем они себя называют. Как правило, это осуществляется путем передачи ключа с каждым запросом, который часто называется токеном доступа (например, JWT JSON Web Token). Сервер проверяет подлинность токена доступа и наличие у пользователя необходимых прав для доступа к запрошенному ресурсу. Только тогда запрос будет удовлетворен.

Самый распространенный способ предоставить пользователю токен доступа - это запрос пароля.

Текущее состояние паролей

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

После утечки вашей базы данных пароли уязвимы для нескольких атак:

  • Радужные столы
  • Грубая сила
  • Пароли украдены у третьих лиц

Радужные столы

Радужные таблицы - это предварительно вычисленные таблицы, используемые для поиска паролей с использованием украденных хешей. Сегодня существуют радужные таблицы, которые могут обнаруживать почти все возможные пароли длиной до 14 символов для алгоритмов хеширования, таких как MD5 или SHA-1!

Одним из способов защиты от радужных таблиц является подделка паролей.

Соль - это последовательность случайных символов, которая сочетается с паролем в процессе хеширования.

Грубая сила

Атака методом грубой силы будет пытаться взломать пароль, ища совпадение, используя комбинацию всех возможных символов.

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

Один из способов предотвратить атаки методом перебора - программная блокировка учетной записи пользователя после нескольких неудачных попыток входа в систему.

Однако это не защитит пароли, если злоумышленник уже получил доступ к базе данных паролей.

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

Украденные пароли

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

Https://www.zdnet.com/article/44-million-microsoft-users-reused-passwords-in-the-first-three-months-of-2019/

Из-за угрозы кражи паролей любая политика, основанная исключительно на защите паролем, небезопасна. Чтобы защитить вашу систему от злоумышленников, необходима еще одна линия защиты ⚔️

Многофакторная аутентификация

Многофакторная аутентификация - это стратегия аутентификации, которая требует, чтобы пользователь предоставил подтверждение аутентификации с помощью двух или более факторов аутентификации:

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

Существует популярный шаг в сторону использования фактора владения с использованием одноразовых паролей (одноразовых паролей), таких как Google Authenticator, который генерирует одноразовые пароли для мобильного телефона.

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

Криптография с открытым ключом

Криптография с открытым ключом или асимметричная криптография - это схема шифрования, в которой используются два математически связанных, но не идентичных ключа (открытый ключ / закрытый ключ).

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

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

Основные бизнес-приложения для криптографии с открытым ключом:

  • Цифровые подписи. Контент имеет цифровую подпись с личным ключом и подтверждается открытым ключом.
  • Шифрование: контент зашифровывается с помощью открытого ключа отдельного человека и может быть расшифрован только с помощью личного ключа.

Для получения дополнительных сведений о том, как шифрование с открытым ключом, ознакомьтесь с этим отличным объяснением от Tesla 809

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