在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
这是一个简单的方法:
- 创build一个python模块 – 我们称之为peekaboo.py。
- 在peekaboo.py中,包含密码和需要该密码的任何代码
- 创build一个编译版本 – peekaboo.pyc – 通过导入这个模块(通过python命令行等)。
- 现在,删除peekaboo.py。
- 你现在可以高兴地依靠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