Python 隐藏密码的最佳方式是什么?

Python 隐藏密码的最佳方式是什么?,python,passwords,Python,Passwords,我有一个连接到数据库的Python脚本。很明显,我需要密码。我需要把它藏起来 我的问题是,该代码存储在一个文件夹中,每个有权访问服务器的人都可以查看该文件夹。因此,如果我将这个密码加密写入一个文件中,代码中会出现发现它的密钥,人们可以找到它 所以,如果有人有想法的话,请告诉我..您使用的是脚本语言,并使用密码直接访问数据库。不管你做什么,在某种程度上,这个密码将是容易访问的。掩盖它并不能给你带来很多好处 您必须依赖计算机的安全性和权限,可能还需要依赖数据库(限制特定计算机和用户的访问) 查看问题

我有一个连接到数据库的Python脚本。很明显,我需要密码。我需要把它藏起来

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


所以,如果有人有想法的话,请告诉我..

您使用的是脚本语言,并使用密码直接访问数据库。不管你做什么,在某种程度上,这个密码将是容易访问的。掩盖它并不能给你带来很多好处


您必须依赖计算机的安全性和权限,可能还需要依赖数据库(限制特定计算机和用户的访问)

查看问题。他们建议在base64中对密码进行编码(在脚本之外),然后在脚本中包含该字符串,并在建立连接之前将其转换回来。不要在Python文件中存储数据库连接凭据。相反,将它们存储在一个安全的地方,只能由脚本将在其中运行的用户帐户读取

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


然后作业可以始终在该用户帐户下运行。您还可以在您的帐户下运行它,方法是在您的主目录中放置一个具有正确凭据的
数据库.ini
文件,但是任何没有凭据的人都不能运行它。

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

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

那么,让文件只对所有者可读如何?遗憾的是,这对您没有好处。如果我能读剧本,我也能做同样的事情。复制和粘贴并不困难。一个随机的字母串和字符串可以做同样的事情(什么都不做),而不必用base64编码。(我相信另一个问题更多的是关于“肩上冲浪”,这也是…你所需要的只是一个随机字符串,很难一眼记住)。我知道,但至少它不是纯文本,你不能使用文件中的文本字符串直接登录。是的,我可以。我只需先对其进行base64解码即可获得普通密码。这就是脚本所做的,所以我知道这是我必须做的。任何知道对数据库做坏事的恶意用户都会知道对base64进行解码。它没有增加任何实际的安全性。我同意,但是如果你打算通过纯文本脚本访问数据,那么密码只是问题的开始。知道如何解码base64密码的用户也知道如何更改数据访问SQL(或其他内容),即使密码可以得到适当的保护。这就是为什么我对布赖恩的答案感到惊讶!如果这些用户中的任何一个在.ini文件上设置了
o+r
(或者
g+r
)?我可以阅读脚本,然后执行
查找
查找可访问的脚本。我宁愿锁定脚本本身并允许对特定用户或组执行。@布赖恩:希望每个用户在其.ini文件中公开不同的密码。因此,如果一个帐户被泄露,那么该帐户可以被锁定。但你是对的:如果你能锁定对脚本本身的读取权限,那就更好了。是的,我不是说你的答案没有提供一个好的设计-但是为了安全,我倾向于从不信任用户:-我不认为有线协议是个问题--不管怎样,脚本将需要向数据库提供某种凭据,因此需要保护该凭据。另外,我看不到在问题中提到MySQL的地方,所以为什么你认为这就是正在使用的?嗯,是的,我想它不可能是MySQL,尽管我想其他dbms也使用类似的方法。虽然内部秘密值在某个时候被提供,但它可以变得非常复杂,并且很难解开。一个人甚至可以使用一个中间人的方法,其中MITM是用C写的。这样,密码就无法恢复。是的,看起来这是不可能的事情。管理权限不是解决方案,因为此脚本必须通过web运行。但是谢谢你的回答。你说它不是一个选项是什么意思,因为它是从网络上运行的??如果它是从网络上运行的,你真的需要注意所有权和权限!