Беспарольная авторизация через блокчейн

in #authentication8 years ago (edited)

Беспарольная авторизация через блокчейн

Последнее время я думаю над тем, насколько неудобна текущая система аутентификации, построенная на логинах и паролях. Люди постоянно забывают пароли - 37% пользователей обращаются за помощью по этому поводу в течении месяца как минимум на одном вебсайте, по данным Deloitte. Для того, чтобы не забывать их, люди стараются использовать максимально простые комбинации одновременно на нескольких сайтах. Поэтому база из 10000 самых популярных паролей дает доступ к 98% всех аккаунтов, при этом средний пользователь использует только 5 разных паролей для доступа к 26 сервисам (по данным Experian).

Поэтому злоумышленники взламывают аккаунты именно через подбор или похищение данных пользователя. И если в 2013 году таких случаев было 76%, то в прошлом году стало 95% (Verizon Data Breach Investigation Reports). Оно и понятно, взломщики просто выбирают самое слабое место - простой пароль. Вы можете потратить много денег и создать для вашего сервиса очень качественную и защищенную систему безопасности - но все усилия бессмысленны из-за пароля "12345", выбранного вашим пользователем. Наверное, поэтому затраты на обеспечение безопасности каждого аккаунта пользователя составляют для западных компаний 201$, а сумма потерь от киберпреступности достигнет 2,1 триллиона долларов к 2019 году (в 4 раза больше, чем в 2015, по данным Juniper Research).

Какие бы усилия не прилагали эксперты по безопасности, рассказывая про требования к паролю при создании учетной записи, человеческую природу не победить, поэтому предлагаю зайти с другой стороны :)

Несмотря на существование многих сервисов, призванных облегчить или перебороть эту проблему, они служат лишь надстройкой, не меняя сути проблемы. Сервисы вроде 1Password и LastPass немного облегчают задачу, запоминая пароли или создавая один мастер-пароль. Многие другие программы (такие, как браузеры) также запоминают однажды введенный пароль и автоматически подставляют его при повторном посещении. Пока оставим за скобками снижение уровня безопасности при такой схеме, когда от фактора "что-то, что вы знаете" происходит переход к фактору "что-то, что у вас есть" - компьютер с установленной программой-"запоминалкой", когда к вашему аккаунту сразу появляется доступ у того, кто находится рядом с устройством и пароль вообще теряет смысл. Большей проблемой здесь, я считаю, является централизованная архитектура базы данных логинов и паролей, хранящаяся у сервиса. Ведь доступ к этой базе тоже доступен (внезапно) по логину и паролю. Конечно, тут пароль может быть сложнее, так как средний администратор более искушен в вопросах безопасности, чем средний пользователь. Поэтому получить доступ к этой базе может быть немного сложнее и потребуется кража файлика с паролями или листка бумаги, на котором он написан, как в сериале "Кремниевая долина" :)

Из-за всего этого прогрессивное человечество придумало еще один способ защиты особо важных аккаунтов - "двухфакторную авторизацию" или 2FA, основанную на комбинации факторов. Например, всем известный Google Authenticator - на компьютере нужно ввести код из смартфона, который обновляется через короткий промежуток времени. Опять же, решение это неидеальное и в плане безопасности - вводить код нужно на устройстве, которое может быть уже под контролем злоумышленника, и в плане удобства - каждый раз пользоваться такой схемой ленивым юзерам надоедает, и они это делают только для критически важных и/или нечасто используемых аккаунтов.
Еще одной популярной разновидностью 2FA являются коды через СМС - тут есть другая проблема, связанная со стоимостью этих самых СМС, из-за чего сервисы переходят на отправку кода через мессенджеры. Кроме того, недавняя история с перехватом СМС спецслужбами России для получения доступа к переписке граждан тоже не добавляет уверенности в защищенности такого канала.
Также хочу упомянуть Clef - отличный сервис в плане удобства с оригинальным решением, но не работающий для мобильных устройств.
Использование хард-токенов вроде флешек или других устройств может быть удобно для служебного использования в компаниях, но крайне неудобно при большом количестве клиентов, использующих к тому же смартфоны.

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

Главная из этих технологий - блокчейн. Децентрализованная база данных решает проблему центрального сервера, который можно взломать.
Кроме того, она работает на ассиметричном шифровании с длиной ключа 256 бит, являющемся в этом смысле супербезопасным паролем. Конечно, его сложно запомнить обычному человеку, но это и не потребуется - ключ можно использоваться так же, как сейчас это происходит в мобильных кошельках - он будет подтягиваться из хранилища устройства автоматически.
Еще у нас давно есть такая штука, как SSL-сертификаты, защищающие от атаки типа MIM - "человек посередине". Решение заключается в том, чтобы выпустить SSL-сертификат с адресом электронной почты и номером телефона пользователя, при этом хеш (контрольную сумму) сертификата записать в блокчейн.

Подробно, как это работает:

  1. Когда пользователь из браузера с сертификатом идёт на сайт, последний требует у браузера предъявить сертификат клиента.
  2. Сервер, получив сертификат, вначале проверяет его подпись.
  3. Сервер генерирует случайное число, шифрует его на публичном ключе, находящемся в предъявленном сертификате, и отправляет вашему браузеру. Это - одноразовый пароль соединения.
  4. Браузер, имея файл с сертификатом и ключом, извлекает из него секретный ключ и расшифровывает пароль, посланный сервером. После этого браузер устанавливает безопасное https-соединение с сервером.
  5. Сервер, убедившись в том, что клиент владеет корректным секретным ключом, производит проверку информации сертификата через блокчейн. Для этого он извлекает из сертификата серийный номер, и выполняет поиск по этому серийному номеру. После этого сервер вычисляет контрольную сумму только что полученного сертификата и убеждается в том, что предъявленный сертификат с соответствующим серийным номером – то же самый, который участвовал в регистрации.

Если злоумышленник сгенерирует другой сертификат с тем же серийным номером что и ваш, то он не сможет загрузить контрольную сумму в блокчейн, так как она уже занята вами. А если он создаст сертификат с другим серийным номером – то это будет уже другой ID, и для него сервер создаст другую учётную запись.

Теперь нужно сделать все это удобным для пользователя. Для этого просим его ввести только адрес электронной почты и номер телефона (никаких паролей!). Генерируем локально сертификат с этими данными и предлагаем пользователю установить его в браузер. После этого просим активировать учетную запись переходом по ссылке из почты и отправляем в любой мессенджер, поддерживающий ботов, форму подтверждения номера телефона. Замечу, что в отличии от кода в СМС или обычного сообщения с таким кодом в мессенджере, форма подтверждения дает возможность использовать независимый канал связи смартфона для второго фактора, а не канал потенциально скомпрометированного компьютера.

Так у нас появляется возможность использовать решение без паролей, центрального сервера и обычных баз данных, при этом удобное для пользователя. Для повседневного использования не нужно использовать мессенджер с 2FA, для большинства сервисов будет достаточно сертификата браузера - это будет похоже на текущее использование разнообразных "хранителей паролей", но без риска взлома центрального сервера и утечки вашего пароля и постоянных забываний/восстановлений. Для сервисов с "sensitive data" рекомендуется использовать 2FA, но и тут процесс становится гораздо комфортнее - нужно всего лишь нажать "Yes" в мессенджере.

Сертификаты можно устанавливать и в мобильные устройства (как часть приложения с помощью SDK), при этом ОС тут же предложит установить защиту с помощью остальных двух факторов - биометрию, пин-код или графический ключ. Использование всех функций остается на усмотрение пользователя, но самое главное, что даже в самой простой версии с авторизацией через один фактор такое решение выглядит гораздо безопаснее текущих реализаций, при этом позволяет войти с любого устройства, и готово к будущему - интернету вещей. Ведь нашим девайсам недоступна биометрия и пароли, они будут работать именно по такой схеме - с токенами/ключами. Мы можем сделать их взаимодействие между собой более безопасным, чем сейчас.

Популярные вопросы и ответы:

Что происходит при потере устройства?
Привязка аккаунта идет к номеру телефона и адресу электронной почты, поэтому на сайте сервиса можно будет приостановить доступ к аккаунту с помощью электронной почты до момента восстановления номера телефона. После этого можно будет перевыпустить сертификат. Сервисы, использующие эту систему, возможно будут собирать другие данные, вроде сканов документов и фото клиентов, по которым можно будет восстановить доступ в особо сложных ситуациях. Со временем, надеюсь, мы придем к тому, что вся идентификационная информация пользователя будет храниться в блокчейне и физическое присутствие для таких действий не потребуется.

Какие примеры реализации уже есть?
Схему авторизации через SSL-сертификат разработали в Emercoin, почитать подробно можно здесь. Мы используем их концепцию для MVP, добавляя второй фактор, автоматическую генерацию сертификата без необходимости разворачивания сервера с установленным кошельком, и т.д., приводя сервис в "юзабельный" вид для конечного пользователя. Планируем реализовать эту же технологию на блокчейне биткойна, если увидим спрос.

Сколько это будет стоить?
Для пользователя - нисколько. За это будут платить владельцы сервисов, которые хотят уменьшить на траты на безопасность и улучшить и упростить пользование своим сервисом для клиентов. Возможны ситуации, когда сервис захочет переложить эти затраты на пользователя. Например, это могут быть небольшие биткойн-биржи с большим количеством клиентов, но небольшими доходами. В таком случае плата в 1$/год должна быть приемлемой для пользователя.
Модель оплаты за пользователя выбрана по той причине, что для создания записи в блокчейне нужно провести транзакцию. Периодически нужно будет обновлять запись из-потери устройств и т.д.

Очень хотелось бы услышать мнение сообщества по удобству такого решения - сложно ли будет загрузить сертификат для неопытного юзера? (его загрузка и установка похожа на такой же процесс для обычной программы). Какие уязвимые места в такой схеме вы видите? Пользовались бы сами таким сервисом как сервис? Как пользователь? Или этой проблемы не существует и текущее положение дел вас полностью устраивает?

Sort:  

Моё мнение про пароли - просто пропагандировать этот комикс https://xkcd.com/936/
Еще одно - из англоязычного сообщества неоднократно поступали просьбы публиковать тексты на русском под тегом #ru

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