12 февраля 2017 г. 18:45 (ред. 12 февраля 2017 г. 18:49)
О библиотеке, позволяющий реализовать аутентификацию на основе Secure Remote Password (SRP) в Python.
Вчера закончил работу над первой версией библиотеки srptools.
Библиотека позволит вам в приложениях на Питоне реализовать аутентификацию на основе протокола SRP.

Данный протокол, являясь представителем семейства PAKE (password-authenticated key agreement), позволяет одной стороне получить представление о том, обладает ли сторона противоположная знанием пароля (при этом сам пароль не пересылается). Такой способ аутентификации обладает достаточно высокой надёжностью, если сообщение производится с использованием TLS.

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

В упрощённом виде взаимодействие по протоколу при помощи библиотеки можно описать так:

from srptools import SRPContext, SRPServerSession, SRPClientSession

# На основе логина и пароля
# формируем набор (логин, сверка_пароля, соль).
# Этого набора достаточно серверу для получения
# представления о том, знает ли клиент пароль.
context = SRPContext('alice', 'password123')
username, password_verifier, salt = context.get_user_data_triplet()

# Сервер получает от клиента имя пользователя
# и, обладая сверкой_пароля, вычисляет публичный ключ.
server_session = SRPServerSession(SRPContext(username), password_verifier)
server_public = server_session.public

# Клиент получает от сервера публичный ключ и соль,
# осуществляет их обработку,
client_session = SRPClientSession(SRPContext('alice', 'password123')
client_session.process(server_public, salt)
# генерирует свой публичный ключ и ключ сессии.
client_public = client_session.public
client_session_key = client_session.key

# Сервер получает публичный ключ клиента,
# обрабатывает его
server_session.process(client_public, salt)
# и осуществляет сверку ключей сессий.
assert server_session.key == client_session_key

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

Проект разрабатывает открыто — srptools на GitHub.

Не пересылайте пароли.