在python脚本中隐藏密码(仅限不安全的混淆)

我有一个正在创build一个ODBC连接的Python脚本。 ODBC连接是使用连接string生成的。 在这个连接string中,我必须包含这个连接的用户名和密码。

有没有一种简单的方法来隐藏该文件中的密码(只是当我编辑文件时,没有人可以读取密码)?

Base64编码是在标准库中,并将停止肩膀冲浪者:

>>> import base64 >>> print base64.b64encode("password") cGFzc3dvcmQ= >>> print base64.b64decode("cGFzc3dvcmQ=") password 

Douglas F Shearer's是Unix中普遍认可的解决scheme,当您需要为远程login指定密码时。
您可以添加–password-from-file选项来指定path并从文件读取纯文本。
该文件可以在用户自己的操作系统保护的区域中。 它也允许不同的用户自动拿起他们自己的文件。

对于脚本用户不被允许知道的密码,您可以使用严格的权限运行脚本,并拥有root / admin用户拥有的密码文件。

如果您正在使用Unix系统,请利用标准Python库中的netrc模块。 它从单独的文本文件(.netrc)读取密码,其格式如下。

这里有一个小例子:

 import netrc # Define which host in the .netrc file to use HOST = 'mailcluster.loopia.se' # Read from the .netrc file in your home directory secrets = netrc.netrc() username, account, password = secrets.authenticators( HOST ) print username, password 

这是一个简单的方法:

  1. 创build一个python模块 – 我们称之为peekaboo.py。
  2. 在peekaboo.py中,包含密码和需要该密码的任何代码
  3. 创build一个编译版本 – peekaboo.pyc – 通过导入这个模块(通过python命令行等)。
  4. 现在,删除peekaboo.py。
  5. 你现在可以高兴地依靠peekaboo.pyc来导入peekaboo。 由于peekaboo.pyc是字节编译的,它对于临时用户是不可读的。

这应该比base64解码更安全一些 – 虽然它易受py_to_pyc反编译器的影响。

假设用户在运行时不能给出用户名和密码,最好的解决scheme可能是一个单独的源文件,只包含导入到主代码中的用户名和密码的variables初始化。 这个文件只需要在凭证更改时进行编辑。 否则,如果你只是担心平均记忆的肩膀,base 64编码可能是最简单的解决scheme。 ROT13太容易手动解码,不区分大小写,在encryption状态下保留太多的意义。 在python脚本之外编码您的密码和用户标识。 他有脚本解码在运行时使用。

为自动化任务提供脚本凭据始终是一个有风险的build议。 您的脚本应该拥有自己的凭据,而且它所使用的帐户应该没有其他访问权限,而不是正好是必需的。 至less密码应该很长,而且是随机的。

如何从脚本外部的文件导入用户名和密码? 这样,即使有人拿到脚本,他们也不会自动获得密码。

base64是为您的简单需求去的方式。 无需导入任何东西:

 >>> 'your string'.encode('base64') 'eW91ciBzdHJpbmc=\n' >>> _.decode('base64') 'your string' 

这是一个很常见的问题。 通常情况下,你可以做的最好的是要么

A)创build某种ceasar密码function来编码/解码(只是不是rot13)或B)首选的方法是使用encryption密钥,在您的程序范围内,对密码进行编码/解码。 您可以在其中使用文件保护来保护访问密钥。 如果您的应用程序作为服务/守护程序(如Web服务器)运行,则可以使用密码input作为服务启动的一部分将密钥放入受密码保护的密钥库中。 这将需要一个pipe理员重新启动你的应用程序,但是你将有很好的保护你的configuration密码。

您的操作系统可能提供安全encryption数据的工具。 例如,在Windows上有DPAPI(数据保护API)。 为什么不在第一次运行时向用户询问他们的凭据,然后将它们encryption以便随后运行?

更多的自制方法,而不是将authentication/密码/用户名转换为encryption细节。 FTPLIB就是这个例子。 “ pass.csv ”是csv文件的名称

以CSV格式保存密码,如下所示:

用户名

用户密码

(没有列标题)

读取CSV并将其保存到列表中。

使用列表元素作为validation细节。

完整的代码。

 import os import ftplib import csv cred_detail = [] os.chdir("Folder where the csv file is stored") for row in csv.reader(open("pass.csv","rb")): cred_detail.append(row) ftp = ftplib.FTP('server_name',cred_detail[0][0],cred_detail[1][0]) 

将configuration信息放在一个encryption的configuration文件中。 在您的代码中使用密钥查询这些信息。 将此密钥放置在每个环境的单独文件中,并且不要将其与代码一起存储。

在网上有几个ROT13工具用Python编写 – 只是谷歌他们。 ROT13将string脱机编码,将其复制到源中,在传输点进行解码。

但是,这是非常薄弱的保护…

你知道坑吗?

https://pypi.python.org/pypi/pit (仅限py2(版本0.3))

https://github.com/yoshiori/pit (它将在py3(当前版本0.4))上工作)

test.py

 from pit import Pit config = Pit.get('section-name', {'require': { 'username': 'DEFAULT STRING', 'password': 'DEFAULT STRING', }}) print(config) 

跑:

 $ python test.py {'password': 'my-password', 'username': 'my-name'} 

〜/ .pit / default.yml:

 section-name: password: my-password username: my-name 

如果在Windows上运行,可以考虑使用win32crypt库。 它允许正在运行脚本的用户存储和检索受保护的数据(密钥,密码),因此密码绝不会以明文或模糊forms存储在代码中。 我不确定是否有其他平台的等效实现,所以严格使用win32crypt的代码是不可移植的。

我相信这个模块可以在这里获得: http : //timgolden.me.uk/pywin32-docs/win32crypt.html