在Python中开发时保护MySQL密码?

时间:2011-08-08 10:52:56

标签: python mysql

我正在编写一个使用MySQL数据库的Python脚本,该数据库是本地托管的。该程序将作为源代码提供。因此,裸眼可以看到MySQL密码。有保护这个的好方法吗?

这个想法是为了防止一些顽皮的人查看源代码,直接访问MySQL,做一些事情......好吧,顽皮。

4 个答案:

答案 0 :(得分:13)

简短回答

你不能。

如果密码存储在发送给最终用户的工件中,则必须认为它已被泄露!即使工件是编译的二进制文件,也总是(或多或少)复杂的方法来获取密码。

保护资源的唯一方法是向最终用户公开有限的API。构建程序化API(REST,WS + SOAP,RMI,JavaEE + Servlets,...)或仅通过SPROC公开数据库中的某些功能(见下文)。

首先有些事情......

这里的问题不应该是如何隐藏密码,而是如何保护数据库。请记住,密码通常只是一种非常弱的保护,不应被视为保护数据库的唯一机制。你在使用SSL吗?没有?那么,即使如果你设法在应用程序代码中隐藏密码,它仍然很容易在网络上嗅探它!

您有多种选择。所有都具有不同程度的安全性:

“应用程序角色”

为应用程序创建一个数据库用户。为此角色申请授权。一个非常常见的设置是仅允许CRUD操作。

赞成

  • 非常易于设置
  • 防止DROP查询(在SQL注入中f.ex.?)

缺点

  • 每个看到密码的人都可以访问数据库中的所有数据。即使该数据通常隐藏在应用程序中。
  • 如果密码被泄露,用户可以在没有标准的情况下运行UPDATEDELETE个查询(即:一次删除/更新整个表格)。

Atomic auth& auth

为每个应用程序/最终用户创建一个数据库用户。这允许您甚至在每列的基础上定义原子访问权限。例如:用户X只能选择远离表foo的列和baz。没有别的。但是,用户Y可以SELECT一切,但没有更新,而用户Z具有完整的CRUD(选择,插入,更新,删除)访问权。

某些数据库允许您重用操作系统级凭据。这使得对用户的身份验证透明(只需要登录到工作站,然后将该身份转发到数据库)。这在完整的MS堆栈(OS = Windows,Auth = ActiveDirectory,DB = MSSQL)中最容易实现,但据我所知 - 也可以在其他数据库中实现。

赞成

  • 相当容易设置。
  • 非常原子授权方案

缺点

  • 在数据库中设置所有访问权限可能很繁琐。
  • 拥有UPDATEDELETE权限的用户仍然可以在没有条件的情况下意外(或故意?)删除/更新。您可能会丢失表中的所有数据。

使用原子auth& auth

的存储过程

在您的应用程序中编写 no SQL查询。通过SPROC运行所有内容。然后为每个用户创建db-accounts,并为SPROC 分配权限。

赞成

  • 最有效的保护机制。
  • SPROC可以强制用户将标准传递给每个查询(包括DELETEUPDATE

缺点

  • 不确定这是否适用于MySQL(我对该领域的了解不多)。
  • 复杂的开发周期:首先必须在SPROC中定义您想要做的所有事情。

最后的想法

您永远不应该允许应用程序的数据库管理任务。大多数情况下,应用程序所需的唯一操作是SELECTINSERTDELETEUPDATE。如果您遵循此指南,用户几乎不会发现密码。除了上面提到的几点。

无论如何,请保留备份。我假设您希望为数据库预测意外删除或更新。但事故发生了......记住这一点;)

答案 1 :(得分:6)

在这种情况下,我在.my.cnf中创建了一个新的部分,比如

[files]
host=127.0.0.1
port=3307
database=files
default-character-set=utf8
password=foobar

并使用

在数据库初始化时使用它
d=MySQLdb.connect(
    read_default_group='files',
    port=0,  # read from .my.cnf
    db='files',
    cursorclass=cursors.DictCursor,
    # amongst other stuff
)

答案 2 :(得分:0)

这里有类似的未回答的问题:https://stackoverflow.com/questions/2850710/connect-to-a-db-with-an-encrypted-password-with-django python DBAPI(PEP 249)没有用于使用加密/哈希密码连接到数据库的接口来代替明文密码。

虽然其他语言的这个功能令人欣慰,但它并没有提供任何真正的附加安全性:密码的哈希值与密码一样好。您仍然必须将对数据库资源的访问权限控制为exhuma describes

MySQL本身不提供任何其他选项,无论是否有python绑定。您可以在Password Security.的MySQL用户手册部分阅读他们的指导。保护访问密码的建议选项是将其存储在选项文件中并通过glglgl保护文件,如described

从该页面开始:

  

运行客户端时可用于指定密码的方法   此处列出了计划,并对风险进行了评估   每种方法。简而言之,最安全的方法是拥有客户   程序提示输入密码或指定密码   妥善保护的选项文件。

答案 3 :(得分:-3)

使用像root这样的简单密码。否则不要使用密码。