Безопасная аутентификация и авторизация пользователей в настольном приложении Python PyQt

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

Это было полностью реализовано на Python с использованием SQLAlchemy для взаимодействия с базой данных и PyQt для пользовательского интерфейса.

Введенный пароль хэшируется с помощью brcypt, а затем сравнивается с хэшем, присутствующим в базе данных для соответствующего имени пользователя (стандартный метод аутентификации, используемый в веб-сервисах).

После успешной аутентификации переменная с именем self.authenticatedUser содержит экземпляр SQLAlchemy класса User.

Следствием этой реализации является то, что любой может отредактировать метод входа в систему, чтобы просто запросить базу данных напрямую для объекта типа User с именем пользователя admin и назначить возвращенный экземпляр SQLAlchemy User на self.authenticatedUser, и бинго, хакер имеет доступ к системе.

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

Существуют ли какие-либо конкретные способы реализовать это более безопасным способом?

  1. Использование локальной базы данных MySQL
  2. Использование безопасного (относительно трудно реконструируемого) механизма.

person RHLK    schedule 13.10.2017    source источник
comment
Вы можете подумать о его распространении с помощью PyInstaller в виде двоичного файла ОС. SQLAlchemy и PyQt находятся в списке поддерживаемых пакетов. PyInstaller даже поддерживает PyCrypto.   -  person Sven Krüger    schedule 24.10.2017


Ответы (3)


Все зависит только от того, насколько сложно реконструировать код, поэтому вот несколько способов его «защиты».

  • предварительно скомпилировать ваше приложение в байтовый код (но есть инструменты для его обратной декомпиляции, такие как uncompyle6)
  • используйте какой-нибудь обфускатор для вашего кода, чтобы он был трудночитаемым (например, pyminifier)
  • зашифровать ваше приложение (например, pyconcrete)
  • используйте пароль пользователя для шифрования важной части самого приложения на лету. С паролем хакер может воссоздать незашифрованное приложение, но без него это невозможно.
person j123b567    schedule 21.10.2017
comment
pyminifier не будет работать с кодами pyqt. он преобразует все переменные класса в глобальные - person Foggy Minded Greenhorn; 28.09.2020

Обслуживание возможно даже при воздушном зазоре. Однако, если вы не хотите этого делать, вы должны защитить свои данные, как если бы вы предоставили каждому пользователю соответствующий SQL-клиент (например, pgAdmin или SQL Server Management Studio). Я предлагаю вам начать настройку ваших ролей/пользователей на уровне базы данных.

person Rick    schedule 24.10.2017

Поскольку bcrypt больше не используется, вы можете легко использовать SHA2x. Я думаю, вам нужно рассмотреть возможность использования SHA2x по соображениям безопасности. Во-вторых, вы можете использовать JWT, так как он на 100% работает с python. Также внимательно изучите двухфакторную аутентификацию, которая станет еще одним плюсом для вашей проверки безопасности.

person DorkSeal3R    schedule 24.10.2017