Прежде чем мы углубимся в код 🤖, я сначала объясню, что мы в настоящее время используем для предоставления пользователю доступа к ресурсу.
Во-первых, зачем мы это делаем?
Потому что нам нужно знать, что подключенный пользователь является тем, кем он себя называет (аутентификация), и должен ли пользователь иметь доступ к данному ресурсу (авторизация).
Аутентификация
Аутентификация - это механизм, который подтверждает личность пользователей, пытающихся получить доступ к системе. Чтобы пользователям был предоставлен доступ к ресурсу, они должны сначала доказать, что они те, кем они себя называют. Как правило, это осуществляется путем передачи ключа с каждым запросом, который часто называется токеном доступа (например, JWT JSON Web Token). Сервер проверяет подлинность токена доступа и наличие у пользователя необходимых прав для доступа к запрошенному ресурсу. Только тогда запрос будет удовлетворен.
Самый распространенный способ предоставить пользователю токен доступа - это запрос пароля.
Текущее состояние паролей
Предполагая, что пароли хранятся с хешем одностороннего шифрования 🙃 и что пользователь выбирает длинные случайные символы для каждого приложения, что не является общим случаем, так что даже если злоумышленник получит доступ к базе данных пользователей, он не будет иметь доступа к пароли пользователей легко.
После утечки вашей базы данных пароли уязвимы для нескольких атак:
- Радужные столы
- Грубая сила
- Пароли украдены у третьих лиц
Радужные столы
Радужные таблицы - это предварительно вычисленные таблицы, используемые для поиска паролей с использованием украденных хешей. Сегодня существуют радужные таблицы, которые могут обнаруживать почти все возможные пароли длиной до 14 символов для алгоритмов хеширования, таких как MD5 или SHA-1!
Одним из способов защиты от радужных таблиц является подделка паролей.
Соль - это последовательность случайных символов, которая сочетается с паролем в процессе хеширования.
Грубая сила
Атака методом грубой силы будет пытаться взломать пароль, ища совпадение, используя комбинацию всех возможных символов.
Закон Мура жив, и грубая сила стала реальной угрозой. Злоумышленники используют графические процессоры, супервычислительные кластеры и бот-сети Javascript, состоящие из десятков тысяч браузеров, посещающих зараженные веб-сайты.
Один из способов предотвратить атаки методом перебора - программная блокировка учетной записи пользователя после нескольких неудачных попыток входа в систему.
Однако это не защитит пароли, если злоумышленник уже получил доступ к базе данных паролей.
Другой способ защитить учетную запись пользователя - использовать геолокацию, просто сохранив предпочтительные местоположения пользователей вместе с их профилем и попросив их разрешить любые попытки нового местоположения.
Украденные пароли
Безусловно, самой большой угрозой безопасности паролей является тот факт, что эта тактика уже работала против других веб-сайтов, и пользователи имеют тенденцию повторно использовать пароли на разных сайтах.
Из-за угрозы кражи паролей любая политика, основанная исключительно на защите паролем, небезопасна. Чтобы защитить вашу систему от злоумышленников, необходима еще одна линия защиты ⚔️
Многофакторная аутентификация
Многофакторная аутентификация - это стратегия аутентификации, которая требует, чтобы пользователь предоставил подтверждение аутентификации с помощью двух или более факторов аутентификации:
- Фактор знаний (что-то, что знает только ваш пользователь, например, вопросы безопасности ...)
- Фактор владения (то, что есть у пользователя, например, мобильный телефон
- Фактор принадлежности (что-то, что есть у пользователя, например, отпечаток пальца)
Существует популярный шаг в сторону использования фактора владения с использованием одноразовых паролей (одноразовых паролей), таких как Google Authenticator, который генерирует одноразовые пароли для мобильного телефона.
И я думаю, что большинство пользователей не пройдут через все эти меры безопасности, потому что это не смешно, а так называемый пользовательский опыт ушел в туалет 💩. Поэтому я решил провести простой эксперимент с использованием криптографии с открытым ключом.
Криптография с открытым ключом
Криптография с открытым ключом или асимметричная криптография - это схема шифрования, в которой используются два математически связанных, но не идентичных ключа (открытый ключ / закрытый ключ).
В отличие от алгоритмов с симметричным ключом, которые используют один ключ как для шифрования, так и для дешифрования содержимого.
Каждый ключ выполняет уникальную функцию: открытый ключ используется для шифрования, а закрытый ключ используется для дешифрования содержимого.
Основные бизнес-приложения для криптографии с открытым ключом:
- Цифровые подписи. Контент имеет цифровую подпись с личным ключом и подтверждается открытым ключом.
- Шифрование: контент зашифровывается с помощью открытого ключа отдельного человека и может быть расшифрован только с помощью личного ключа.
Для получения дополнительных сведений о том, как шифрование с открытым ключом, ознакомьтесь с этим отличным объяснением от Tesla 809
В части 2 мы построим эксперимент, который использует криптографию с открытым ключом и цифровую подпись как способ аутентификации пользователя.