Как стать автором
Обновить

Передача пароля по открытому каналу (часть 2)

Время на прочтение2 мин
Количество просмотров14K
В первой части статьи обсуждалась ситуация, когда для защиты трафика мы по каким-либо причинам не можем использовать https. При этом, передаваемый в открытом виде пароль становится легкой добычей мошенников. Предложенный в статье метод позволял избавится от угрозы перехваты пароля или от кражи БД хэшей паролей, но был бессилен перед злоумышленником, который и БД владеет и контролирует трафик. Предлагаемый ниже метод безопаснее, но сложнее.


Одним из достоинств алгоритма аутентификации, описанного в первой части статьи, была возможность внедрить его в уже существующие сервисы прозрачно для пользователя. Данное решение сделать этого не позволяет, так как в БД сервера хранятся уже не хэши паролей, а ключи RSA. Выбор асимметричной криптографии обусловлен возможностью хранить в БД информацию (публичный ключ), раскрытие которой не несет угрозу паролю. Наиболее распространенный сегодня размер ключа RSA 1024 bit. Запомнить такой ключ и вводить его вручную нереально. Что бы избежать этого приватный ключ, также хранится на сервере, но в зашифрованном виде. Ключ шифрования генерируется на основании пароля пользователя. Это конечно «костыль», но при использовании пароля в качестве секрета, этот «костыль» неизбежен.

Процесс регистрации выглядит следующим образом:
  1. Клиент выбирает себе логин и пароль;
  2. Клиент генерирует ключевую пару RSA. Открытый ключ e,N и закрытый ключ d,N;
  3. Закрытый ключ d,N шифруется AES используя ключ k на базе пароля;
  4. Клиент отсылает на сервер, а сервер сохраняет — логин, открытый ключ e,N и закрытый ключ d,N зашифрованный на ключе k.

регистрация

Процесс аутентификации выглядит следующим образом:
  1. Клиент отсылает на сервер логин;
  2. Сервер отсылает клиенту случайное число RND зашифрованное открытым ключом e,N и зашифрованный закрытый ключ клиента d,N;
  3. Клиент вводит пароль, формируя тем самым ключ k и расшифровывая им свой закрытый ключ d,N;
  4. C помощью ключа d,N клиент расшифровывает RND и отсылает на сервер hash(RND);
  5. Сервер сравнивает полученный hash с hash(RND) сформированным на сервере.

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

Снова прилагается демонстрация и исходные коды. В подготовке примера использовались библиотека AES Chrisa Veness, библиотека RSA jCryption и библиотека RSA написанная студентами Стэнфорда.

Надеюсь, еще одно, уже более «красивое» решение, я опишу в следующей статье.
UPD: Как и обещал — habrahabr.ru/blogs/web_security/120990
Теги:
Хабы:
Всего голосов 31: ↑31 и ↓0+31
Комментарии15

Публикации

Истории

Работа

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
19 сентября
CDI Conf 2024
Москва
20 – 22 сентября
BCI Hack Moscow
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
24 сентября
Astra DevConf 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн