Содержание

GitHub репозиторий:

Введение

Представим, что у нас имеется некая автономная система (комп в подвале завода), в которой доступ к благам цивилизации интернету осуществляется посредством звонка дяде Васе, который должен срочно отложить все свои дела и пойти держать антенну, дабы смузихлёбы господа разработчики смогли, например, загрузить на эту систему обновления.

В общем, будем считать, что доступа к сети у нас нет. За исключением наличия китайского Wifi-модуля, способного создать нам точку доступа, и привязать к этой системе пару-тройку периферийных устройств. Этот модуль используется для одновременной работы нескольких людей: зарегистрировались, и пошли по своим делам, а доступ к данным в любой момент с телефона.

С одной стороны, такой расклад не очень удобен, с другой — мы можем считать, что получение физического доступ к такому компьютеру — дело неблагодарное, и никто посторонний к нему не притронется. А вот к его Wifi...

Проблема

Встаёт вопрос: как обеспечить безопасность сетевых запросов на данный агрегат. Вариантов, на самом-то деле, масса:

  • Public/private ключи. Тут всё как в ssh: ставим работягам на мобилки приватный ключ, на машину ставим публичный, и вуаля. Но для этого надо заранее синхронизировать работягу и систему. А это не очень удобно, если пользователей много.

  • Пароль. Ну это совсем нехорошо. У половины паролем будет 12345, у другой — дата рождения (себя, кота, мамы, папы, не важно). Да и менять их тоже ведь никто не будет.

  • Access token — вполне неплохо вариант. Скомпрометировать его сложнее, поскольку выдаётся он прямо при подключении, действует ограниченное время, и получается ограниченным способом.

Простейшая схема
Простейшая схема

В итоге, будем использовать именно доступ к ресурсам через токены. В качестве токенов для простоты будет uuid (потому что Qt умеет их генерить из коробки, и это в принципе не самый плохой вариант), жить он будет, скажем, сутки.

Получение token обычно происходит по https (например, через OAuth), но мы это будем делать посредством сканирования Qr-кода с монитора, выведенного куда-то в более удобное место. В принципе, особой разницы нет, важна лишь доверие к способу получения.

Что будет в статьях

Использование QtHttpServer из Qt6. Свершилось чудо, люди почти десяток лет ждали, и теперь мы имеем http-сервер из коробки. В принципе, штука хорошая, можно делать ручки, есть ssl-конфигурации, парсинг параметров, в общем, неплохо.

Нашёл либу для qr-кодов на Qt на основе liqrencode. Большая часть либ либо слишком близка к Си, либо очень коряво написана, но вот конкретно эта реализация с точки зрения кода мне показалась приятной. Сделал форк, пофиксил багу, и изменил линковку для qmake.

Организуем беспрепятственный доступ с доверенных устройств и временный токенезированный для остальных. Токены будут простыми uuid.

Ну, и, возможно, посмотрим, как можно сканировать Qr-код в приложении под Android, написанном на Qt.

Комментарии (0)