问题 隐藏密码的最佳方法是什么?


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

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

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


1473
2018-03-15 17:48


起源

那么如何让文件只对所有者可读? - Sven Marnach


答案:


您正在使用脚本语言并使用密码直接访问数据库。无论你做什么,在某种程度上密码都可以轻松访问。模糊它并不能真正为你买单。

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


9
2018-03-15 17:57



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


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

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

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


6
2018-03-15 18:04



如果这些用户中的任何一个拥有 o+r (要么 g+r 可能)设置.ini文件?我可以阅读脚本,然后做一个 find 寻找可以访问的那个。我宁愿锁定脚本本身并允许执行特定用户或组。 - Brian Roach
@Brian:希望每个用户公开一个 不同 .ini文件中的密码。因此,如果一方遭到入侵,那么该帐户就可以被锁定。但你是对的:如果你可以锁定对脚本本身的读访问权限,那就更好了。 - Daniel Pryden
是的,我并不是说你的答案没有提供好的设计 - 但为了安全起见,我倾向于不相信用户:-D - Brian Roach


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


1
2018-03-15 17:57



可悲的是,这对你没有任何帮助。如果我能阅读剧本,我就能做到 完全相同的事情。复制和粘贴并不困难。一个随机的字母和字符串会做同样的事情(没有),而不必用base64编码它。 (我相信另一个问题更多的是“肩膀冲浪”,这又一次......所有你需要的是一个难以记住的随机字符串)。 - Brian Roach
我知道,但至少它不是纯文本,你不能使用文件中的文本字符串直接登录。 - Jon Egerton
是的我可以。我只需先对它进行base64解码即可获得普通密码。这就是脚本正在做的事情,所以我知道这就是我必须要做的。 - Brian Roach
任何知道足以对您的数据库做坏事的恶意用户都知道足以解码base64。它不会添加任何实际的安全性。 - Daniel Pryden
我同意,但如果你打算通过纯文本脚本进行数据访问,那么密码只是你问题的开始。即使密码可以被正确保护,知道如何解码base64密码的用户也将知道如何更改数据访问SQL(或其他)。这就是为什么我给Brian的答案+1了! - Jon Egerton


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


0
2018-03-15 18:38





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


-1
2018-03-15 18:06



我不认为有线协议是问题 - 这种或那种方式,脚本需要向数据库提供某种凭证,因此需要保护凭证。另外,我没有在提到MySQL的问题中看到任何地方,那么为什么你认为这是在使用什么? - Daniel Pryden
好吧,是的,它不能是mysql我猜,虽然我想其他dbms使用类似的方法。虽然在某些时候提供了内部秘密值,但它可以变得非常复杂并且很难解开。甚至可以使用中间方法中的人,其中MITM是用C语言编写的。这样,密码就无法恢复。 - Spyros