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

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

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

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

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

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

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

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

  • Использование локальной базы данных MySQL
  • Использование безопасного (относительно сложного для обратного проектирования, вероятно, будет подходящим) механизма.

Ответ 1

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

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

Ответ 2

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

Ответ 3

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