Об авторизации, аутентификации и паролях не для программистов. Как это устроено в двух словах
Беседуя с друзьями, не имеющими отношения к IT, я заметил, что многие не понимают, как устроен процесс авторизации и аутентификации на сайтах. Что происходит после ввода логина и пароля и как в дальнейшем веб-страница понимает, что это именно вы. Я решил в общих чертах, не вдаваясь в особенные подробности, описать, как это работает. Ну и заодно рассказать, почему важно придумывать сложные пароли. Начать стоит с аутентификации и последующей авторизации.
Авторизация
Давайте попробуем дать определение авторизации. Авторизация – это предоставление пользователю прав на выполнение определенных действий. В случае веб-сайта это доступ к закрытым частям системы, на которых может быть доступна какая-то личная информация пользователя или предоставлены персонализированные сервисы, например для создания фотоальбомов.
Итак, для авторизации пользователь должен пройти процесс аутентификации, то есть предоставить данные, по которым система поймет, что это именно он, и даст некоторые дополнительные права. Самые распространенные данные такого типа: логин – системное имя, используемое для идентификации, и пароль – секретная последовательность символов, которую знает только пользователь. Более того, даже сам веб-сайт не знает ваш пароль, так как он хранится в базе данных в зашифрованном виде. И когда, например, сайт проверяет его подлинность, то он шифрует то, что вы прислали, и сравнивает данные из базы. Для этого отправленное вами секретное слово преобразуется в последовательность символов с помощью специальной криптографической хеш-функции. При этом расшифровка практически невозможна, что и обеспечивает безопасность пароля.
Когда в заголовках СМИ вы видите информацию об украденной базе паролей, то для пострадавших пользователей это еще не означает, что все пропало. Злоумышленники не расшифровывают пароли, а подбирают их. Это долгая и дорогостоящая операция, особенно если ваше секретное слово достаточно сложное. Ниже я опишу, почему важно иметь сложный пароль. Но перед этим еще немного про аутентификацию.
Таким образом, вы ввели свою пару логин/пароль на сайте, нажали кнопку "войти", программа проверила отправленные вами данные и выдала доступ к некоторому функционалу. Тут мы сталкиваемся со следующей проблемой: как система поймет, что это именно вы находитесь на сайте? Неужели придется каждый раз вводить логин с паролем, подтверждая каждое действие? К счастью, программисты придумали, как идентифицировать и аутентифицировать пользователей без повторного ввода авторизационных данных. Существует несколько способов, и ниже я опишу один из самых распространенных и надежных.
Аутентификация по токенам доступа
Токен – это определенная последовательность символов, которую мы можем применять в разных целях. В нашем случае мы подтверждаем ею права пользователя на совершение некоторых действий. Проще говоря, снабжаем токеном каждую отправку и получение данных на сайте. Токен выдается после успешной проверки логина и пароля. Его можно сравнить с временным пропуском, имеющим срок действия, после истечения которого доступ к функционалу может быть закрыт. Почему “может быть”? Потому что в данном способе аутентификации формируются две последовательности символов. Одна называется “токен доступа” (access token), другая – “токен обновления” (refresh token). Первый токен имеет короткое время жизни: это могут быть несколько секунд, часов, дней – в зависимости от требований к безопасности. Второй живет до одного года, но всегда дольше, чем первый.
На простом примере это можно представить так. Вы арендовали склад и, предоставив паспорт (логин и пароль), получили договор аренды (токен обновления) с пропуском на территорию (токен доступа). Каждый раз при посещении склада вы показываете пропуск, но в какой-то момент срок его действия заканчивается. Для того чтобы получить новый, вы идете в бюро пропусков и предоставляете просроченный пропуск вместе с договором аренды. Оно проверяет соответствие пары пропуска и договора. При этом срок действия последнего не должен быть закончен. И тут я вынужден отойти от реальности. Если это условие соблюдено, то бюро пропусков аннулирует оба документа и выдает новую пару пропуск/договор. После этого вы продолжаете заходить на территорию своего склада уже по новому документу. Еще может случиться ситуация, когда договор аренды (токен обновления) просрочен так же, как и пропуск (токен доступа). В этом случае вы должны снова предоставить паспорт (логин и пароль). Проще говоря, залогиниться и получить новую пару токенов.
Зачем все это нужно? Первое, как я уже упомянул выше, чтобы не вводить каждый раз пару логин/пароль. Второе – чтобы обеспечить замену токенов в разумные сроки и не дать злоумышленникам воспользоваться ими в случае кражи. Помимо этого, в самих токенах может быть закодирована дополнительная информация – для подтверждения того, что они не украдены. Описанная мною схема применяется на огромном количестве веб-ресурсов. Далее я бы хотел сказать несколько слов о том, почему важно придумывать сложные неидентичные пароли для входа в системы.
Как злоумышленники подбирают пароли
Как я уже упомянул выше, пароли надежно шифруются перед записью в базу данных, и даже если злоумышленники их украли, то расшифровать не смогут. Вообще, в теории это возможно, но требует таких вычислительных мощностей, что проще заранее подготовить базы предварительно зашифрованных последовательностей символов и просто сравнить украденные данные с ними – что злоумышленники и делают. Существует множество способов усложнить подбор, сделав его почти невозможным. В этом случае почти все равно, какой сложности пароль мы придумали. Но давайте представим, что программисты не предусмотрели эти дополнительные манипуляции и пароли все же можно подобрать. В этом случае сложность вашего пароля имеет критическое значение. Пароль "123456" сто процентов уже подобран, как и все возможные варианты дат дней рождений, и слова типа "thisisawesomepass" или "neotgadaesh". Поэтому самое надежное – придумать достаточно длинный случайный набор символов, включающий заглавные буквы, цифры, знаки препинания, и использовать их в качестве пароля. Например, "Z6$fe_SS3$b!bGw". Такой пароль подобрать гораздо сложнее, чем уже известные человечеству слова.
Вывод
Я постарался описать процессы авторизации и аутентификации максимально простым языком: как будто я стараюсь объяснить это человеку, не знакомому с программированием. Я намеренно опустил множество существенных нюансов, чтобы не перегрузить информацией неподготовленного читателя. Самое важное, что я хотел бы подчеркнуть: большая часть используемых сейчас алгоритмов авторизации, аутентификации и защиты данных достаточно надежны и снижают вероятность взлома до минимума. Но по-прежнему самое слабое звено – это человек. Отсутствие привычки придумывать разные пароли для разных систем и регулярно их обновлять, а также использование незащищенных публичных сетей типа метрополитена подвергает опасности ваши данные.