- Вначале и клиент, и сервер нужно настроить на единую парольную фразу. Далее клиент отправляет серверу пакет инициализации, а сервер в ответ отправляет порядковый номер и случайное число - «зерно» (seed).
- Клиент вводит секретную парольную фразу. Парольная фраза соединяется с «зерном», полученным от сервера в открытом виде. «Зерно» дает клиенту возможность использовать одну и ту же парольную фразу на множестве машин с разными «зернами».
- Клиент многократно использует хэш-функцию и получает 64-разрядную итоговую величину. При каждом новом использовании количество хэш-циклов уменьшается на один.
- Клиент передает одноразовый пароль на сервер, где он и проверяется. На сервере есть файл, в котором хранится одноразовый пароль, использованный в последнем успешном сеансе связи с каждым отдельным пользователем. Для проверки система однократно пропускает полученный одноразовый пароль через хэш-функцию. Если результат этой операции совпадает с предыдущим паролем, хранящимся в файле, результат аутентификации считается положительным, а новый пароль сохраняется для дальнейшего использования.
- Пользователь может инициализировать систему с помощью команды keyinit, которая дает возможность изменить секретную парольную фразу, количество циклов итерации и «зерно».
IP адрес и порт передаются, как аргументы при вызове программы
- Launch запустить сервер/клиент для приёма/передачи сообщений
- KeyInit изменить стандартные параметры
- Exit выход из программы
Позволяет изменять параметры по умолчанию:
- Парольная фраза (default:
passphrase
) - Количество циклов итерации (default:
1000
) - Зерно (default: random seed) только для сервера
- Используемый язык -- Go. Для обмена данными используются сокеты
- Используемая хэш-функция -- MD5
- Размер передаваемого блока всегда 128 бит
- Парольная фраза изначально определена у клиента и сервера
- Число итераций по умолчанию
n = 1000
- Клиент инициирует общение с сервером, посылая сообщение
!hello
- Сервер отправляет двумя сообщениями:
id
клиента иseed
- Оба вырабатывают пароли для всех будущих идентификаций
- Далее клиент начинает отправлять сообщения
Информация передаётся кусками по 128 бит. Порядок передачи следующий:
- Пароль
i
-ой итерции - Сообщение, разбитое на блоки по 128 бит
- Пустой кусок, как окончание передачи сообщения
В случае, если число итерации закончилось, а клиенту всё ещё нужно продолжить общение с сервером, то они меняют seed
и вырабатывают ещё n
одноразовых паролей
Как это происходит: как только сервер использовал последний одноразовый ключ, он рандомит новый seed и отправляет его клиенту. Клиент принимает seed и оба вырабатывают новые пароли. Далее клиент продолжает передачу сообщений