【问题标题】:Authenticating and authorizing users securely in a Python PyQt desktop application在 Python PyQt 桌面应用程序中安全地验证和授权用户
【发布时间】:2018-03-25 09:23:07
【问题描述】:

我开发的应用程序规定该软件应防止未经授权的访问。为了实现这一点,我使用了基于用户和密码的身份验证以及两个可用的角色 - 标准用户和管理员。

这是完全用 Python 实现的,使用 SQLAlchemy 与数据库交互,使用 PyQt 用户界面。

使用 brcypt 对输入的密码进行哈希处理,然后将其与数据库中相应用户名的哈希值进行比较(Web 服务中使用的标准身份验证技术)。

身份验证成功后,名为self.authenticatedUser 的变量包含User 类的SQLAlchemy 实例。

此实现的结果是任何人都可以编辑登录方法,以简单地使用用户名 admin 直接在数据库中查询 User 类型的对象,并将返回的 User 的 SQLAlchemy 实例分配给 self.authenticatedUser 和宾果游戏黑客可以访问系统。

由于我正在分发这个用 python 编写的软件,因此黑客(或任何类型的程序员)只需几分钟就可以禁用身份验证机制。另外,我不能在此处使用 Web 服务通过获取登录登录令牌进行身份验证或授权,因为该软件将在具有 air gap 的环境中使用。

是否有任何具体的方法可以以更安全的方式实现这一点?

  1. 使用本地 MySQL 数据库
  2. 使用安全(相对难以进行逆向工程可能是合适的)机制。

【问题讨论】:

  • 您可以考虑将其与PyInstaller 作为操作系统二进制文件一起分发。 SQLAlchemy 和 PyQt 在支持的包列表中。 PyInstaller 甚至支持 PyCrypto。

标签: python security authentication sqlalchemy desktop-application


【解决方案1】:

一切都只是逆向工程代码的难易程度,所以这里有一些“保护”它的技术。

  • 将您的应用程序预编译为字节码(但有一些工具可以将其反编译回来,例如 uncompyle6
  • 对你的代码使用一些混淆器,所以它很难读(比如pyminifier
  • 加密您的应用程序(例如pyconcrete
  • 使用用户密码即时加密应用程序本身的重要部分。有了密码,黑客可以重新创建未加密的应用程序,但没有密码,这是不可能的。

【讨论】:

  • pyminifier 不适用于 pyqt 代码。它将所有类变量转换为全局变量
【解决方案2】:

即使有气隙,也可以提供服务。但是,如果您不想这样做,您应该保护您的数据,就好像您为每个用户提供了一个适当的 SQL 客户端(如 pgAdmin 或 SQL Server Management Studio)。我建议您开始在数据库级别配置您的角色/用户。

【讨论】:

    【解决方案3】:

    由于不再采用 bcrypt,您可以轻松使用 SHA2x。我认为出于安全原因您需要考虑使用 SHA2x。其次,您可以使用 JWT ,因为它可以 100% 与 python 一起使用。还可以深入了解 2 因素身份验证,这将是您安全检查的又一优势。

    【讨论】:

      猜你喜欢
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多