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


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

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


7152
2017-08-08 10:52


起源

在中央位置定义并在发货前编辑出来? - Jacob
这会连接到您的数据库或购买者的数据库吗? - Raz


答案:


有些事情先......

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

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

“应用角色”

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

优点

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

缺点

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

Atomic auth&auth

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

优点

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

缺点

  • 可能很乏味
  • 用户用 UPDATE 和 DELETE 权利仍然可能意外(或故意?)删除/更新  标准。您可能会丢失表中的所有数据。

存储过程与原子auth和auth

没有 应用程序中的SQL查询。跑 一切 通过SPROCs。然后为每个用户创建db-accounts并为SPROC分配权限 只要

优点

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

缺点

  • 不确定这是否适用于MySQL(我在该领域的知识是不稳定的)。
  • 复杂的开发周期:您想要做的每件事都必须首先在SPROC中定义。

最后的想法

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

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


12
2017-08-08 11:56





在这种情况下,我在.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
)

6
2017-08-08 11:15



这仍然允许用户读取文件iirc。 - exhuma
这是对的,但它不与源代码一起分发。但可能是我错误地解释了提问者的原始动机 - 我认为他想阻止对来源中包含的密码进行实际分发。 - glglgl
好吧...... my.cnf 文件必须位于客户端上。换句话说,它必须在运行应用程序的机器上。此外,应用程序通常在与用户相同的凭据下运行。这意味着 用户 需要读取文件的访问权限。所以,这会减少它 明显 但是熟练的攻击者仍然可以轻松找到它。 - exhuma
我和提问者有同样的问题,但你的回答确实回答了我想问的问题。 1UP! - weefwefwqg3


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

虽然其他语言中的此功能令人感到欣慰,但它并未提供任何真正的额外安全性:密码的哈希值与密码一样好。您仍然必须控制对数据库资源的访问权限作为exhuma 介绍

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

从那个页面:

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


0
2017-08-08 12:51



我不同意选项文件。这个文件会 不 隐藏撬开用户的密码。正如我在对glglgl的回答的评论中所解释的那样,客户端应用程序需要对文件的读访问权,这反过来意味着用户需要读访问权。通常,非超级用户无法升级访问权限。 - exhuma
我不同意你的观点,但我也不知道其他任何选择。您的帖子涵盖了数据库设计要求以限制曝光,但不涉及凭据的存储。有没有更好的办法? - J.J.
从来没听说过。 :/ - exhuma


要么使用简单的密码 root.Else不要使用密码。


-3
2017-08-08 10:59



如果没有传递的单词,如何防止用户更改数据库? - lang2
对于特定的db,创建一个没有密码的用户,为其他DB创建不同的用户和密码, debuntu.org/... - Kracekumar