如何最好地隐藏密码?

13

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

我的问题是,这段代码存储在每个有服务器访问权限的人都可以查看的文件夹中。因此,如果我将密码加密后写入文件中,在代码中将出现发现它的密钥,人们就可以找到它。

所以,请问是否有任何想法..


5
那么将文件设置为仅所有者可读,如何? - Sven Marnach
5个回答

10
您正在使用脚本语言并直接使用密码访问数据库。无论您做什么,在某个级别上,该密码都将很容易地被访问。掩盖它实际上并没有给您带来太多好处。
您必须依赖计算机的安全和权限,以及可能的数据库(限制从特定计算机和用户的访问)。

是的,看起来这是一件不可能完成的事情。管理权限并不是一个解决方案,因为这个脚本必须通过网络运行。但还是谢谢你的回答。 - Frias
4
“你说它因为从网络运行所以不是一个选项??如果它从网络运行,你真的需要关注所有权和权限!” - Brian Roach

7
不要在Python文件中存储数据库连接凭据。相反,将它们存储在一个安全的地方,只能被脚本运行的用户账户读取。
例如,为运行此任务创建一个用户帐户,并在该用户帐户的主目录中创建一个名为“database.ini”的文件(仅可由该用户读取),并将数据库连接字符串和密码放在其中。然后使用Python标准库中的ConfigParser类来读取该文件。
然后该任务可以始终在该用户帐户下运行。您也可以通过在您的主目录中放置一个具有正确凭据的“database.ini”文件来运行它,但是任何没有凭据的人都无法运行它。

如果这些用户中有任何一个在.ini文件上设置了o+r(或者可能是g+r)呢?我可以读取脚本,然后使用find查找可访问的脚本。我宁愿锁定脚本本身,并允许特定的用户或组执行。 - Brian Roach
1
@Brian:希望每个用户在他们的.ini文件中使用不同的密码。因此,如果一个密码被泄露,那么该账户可以被锁定。但你是对的:如果你能够限制脚本本身的读取权限,那就更好了。 - Daniel Pryden
是的,我的意思不是说你的答案没有提出一个好的设计 - 但是为了安全起见,我倾向于永远不相信用户 :-D - Brian Roach

1

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


1
遗憾的是,这对你没有任何帮助。如果我能读懂脚本,我也可以做完全相同的事情。复制和粘贴并不难。一串随机的字母和字符会做同样的事情(什么都不做),而不必费心去进行base64编码。(我认为另一个问题更多地涉及“肩部冲浪”,再次...你只需要一个难以记忆的随机字符串即可)。 - Brian Roach
1
我知道,但至少它不是明文显示的,而且你无法直接使用文件中的文本字符串进行登录。 - Jon Egerton
可以的。我会先对其进行base64解码以获取明文密码。这就是脚本正在做的事情,所以我知道我需要这样做。 - Brian Roach
1
任何恶意用户只要知道如何对您的数据库进行恶意操作,就足以知道如何解码base64。这并不会增加任何实际的安全性。 - Daniel Pryden
我同意,但如果你要通过纯文本脚本进行数据访问,那么密码只是你问题的开始。一个知道如何解码base64密码的用户也会知道如何更改数据访问SQL(或其他内容),即使密码可以得到适当的保护。这就是为什么我支持Brian的回答! - Jon Egerton

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

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

1
我认为线路协议不是问题——无论如何,脚本都需要向数据库提供某种凭据,因此这个凭据才是需要保护的。此外,我没有在问题中看到提到 MySQL 的地方,你为什么觉得是在使用它? - Daniel Pryden
嗯,我猜可能不是MySQL,虽然我想其他数据库管理系统可能使用类似的方法。尽管内部秘密值在某个时候被提供,但它可以变得相当复杂和难以解开。甚至可以使用中间人攻击的方法,其中MITM是用C编写的。这样,密码就无法恢复。 - Spyros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接