【问题标题】:What is the best way of hide a password?隐藏密码的最佳方法是什么?
【发布时间】:2011-07-16 00:12:16
【问题描述】:

我有一个连接到数据库的 Python 脚本。为此,显然,我需要密码。我需要把它藏在某个地方。

我的问题是这段代码存储在一个文件夹中,每个有权访问服务器的人都可以查看。所以,如果我把这个密码加密写在一个文件中,在代码中就会出现发现它的密钥,人们可以猜出来。

所以,请,如果有人有想法..

【问题讨论】:

  • 那么让文件只有所有者可读怎么样?

标签: python passwords


【解决方案1】:

您正在使用脚本语言并使用密码直接访问数据库。无论您做什么,在某种程度上,该密码都将很容易访问。掩盖它并不能真正给你带来太多好处。

您必须依赖机器的安全性和权限,也许还有数据库(限制特定机器和用户的访问)。

【讨论】:

  • 是的,看起来这是不可能的事情。管理权限不是解决方案,因为此脚本必须通过 web 运行。不过谢谢你的回答。
  • 你是什么意思它不是一个选项,因为它是从网络上运行的?如果它是从网络上运行的,您真的需要注意所有权和权限!
【解决方案2】:

根本不要将数据库连接凭据存储在 Python 文件中。相反,请将它们存储在安全的地方,只有运行脚本的用户帐户才能读取。

例如,创建一个用于运行此作业的用户帐户,并在该用户帐户的主目录(只能由该用户读取)中创建一个名为 database.ini 的文件,并将数据库连接字符串和密码放在那里。然后使用标准库中的PythonConfigParser类将文件读入。

然后作业可以始终在该用户帐户下运行。您也可以在您的帐户下使用正确的凭据将database.ini 文件放入您的主目录中运行它,但是没有凭据的任何人都无法运行它。

【讨论】:

  • 如果这些用户中的任何一个在 .ini 文件上设置了o+r(或可能是g+r)?我可以阅读脚本,然后执行find 寻找可以访问的脚本。我宁愿锁定脚本本身并允许对特定用户或组执行。
  • @Brian:希望每个用户在他们的 .ini 文件中公开一个不同的密码。因此,如果一个帐户遭到入侵,则该帐户可能会被锁定。但您是对的:如果您可以锁定对脚本本身的读取访问权限,那就更好了。
  • 是的,我并不是说你的回答没有提出一个好的设计 - 但为了安全起见,我往往从不信任用户:-D
【解决方案3】:

查看this 问题。他们建议在 base64 中编码密码(在脚本之外),然后在脚本中包含该字符串并在建立连接之前将其转换回来

【讨论】:

  • 可悲的是,这对你没有任何帮助。如果我能读懂剧本,我就能做到完全相同的事情。复制和粘贴并不难。一个随机的字母和字符字符串会做同样的事情(什么都不做),而不必乱用 base64 编码。 (我相信另一个问题更多是关于“肩部冲浪”,这又是......你所需要的只是一个随机字符串,一眼就很难记住)。
  • 我知道,但至少不是纯文本的,你不能使用文件中的文本字符串直接登录。
  • 是的,我可以。我只需先对其进行 base64 解码以获得纯密码。这就是脚本正在做的事情,所以我知道这就是我必须做的事情。
  • 任何知道足以对您的数据库做坏事的恶意用户都知道足以解码 base64。它不会增加任何实际的安全性。
  • 我同意,但是如果您要通过纯文本脚本进行数据访问,那么密码只是问题的开始。即使密码可以得到适当保护,知道如何解码 base64 密码的用户也知道如何更改数据访问 SQL(或其他)。这就是我为 Brian 的回答 +1 的原因!
【解决方案4】:

只是为了强调 Brian 所说的,如果程序自动运行(即,没有机会提示用户输入密码),则在相同用户权限下运行的任何程序都可以访问任何密码。目前还不清楚您可以做什么else。也许如果客户端机器上的(受信任的)操作系统可以向主机证明它正在被从特定路径运行的程序访问,则可以告诉主机“仅打开数据库到 /var/lib/tomcat/bin /tomcat 在 appserver.example.com 上”。如果你完成了所有这些,攻击者将不得不破坏 tomcat 可执行文件才能访问数据库。

【讨论】:

    【解决方案5】:

    更高级的想法是手动进行 mysql 身份验证。也就是说,学习 mysql 协议(这是一个带有挑战和响应的标准握手)并自己执行该过程。这样,您永远不会直接发送密码。

    【讨论】:

    • 我不认为有线协议是问题——无论如何,脚本需要向数据库提供某种凭据,因此需要提供凭据受到保护。另外,我在问题中没有看到提到 MySQL 的任何地方,那么您为什么认为这就是正在使用的内容?
    • 好吧,是的,我猜它不可能是 mysql,尽管我想其他 dbms 使用类似的方法。尽管在某些时候提供了内部秘密值,但它可以变得非常复杂并且很难解开。甚至可以使用中间人的方法,其中 MITM 是用 C 编写的。这样,密码就无法恢复。
    猜你喜欢
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多