我有一个python脚本正在创建一个ODBC连接.使用连接字符串生成ODBC连接.在此连接字符串中,我必须包含此连接的用户名和密码.
是否有一种简单的方法可以隐藏文件中的密码(只是在我编辑文件时没有人能读取密码)?
Base64编码在标准库中,可以阻止肩膀冲浪:
>>> import base64 >>> print(base64.b64encode("password".encode("utf-8"))) cGFzc3dvcmQ= >>> print(base64.b64decode("cGFzc3dvcmQ=").decode("utf-8")) password
当您需要为远程登录指定密码时,Douglas F Shearer是Unix中普遍认可的解决方案.
您可以添加--password-from-file选项以指定路径并从文件中读取明文.
然后,该文件可以位于受操作系统保护的用户自己的区域中.它还允许不同的用户自动获取自己的文件.
对于不允许脚本用户知道的密码 - 您可以使用elavated权限运行脚本,并拥有该root/admin用户拥有的密码文件.
这是一个简单的方法:
创建一个python模块 - 让我们称之为peekaboo.py.
在peekaboo.py中,包括密码和需要该密码的任何代码
创建一个编译版本 - peekaboo.pyc - 通过导入这个模块(通过python命令行等...).
现在,删除peekaboo.py.
你现在可以愉快地导入peekaboo仅依靠peekaboo.pyc.由于peekaboo.pyc是字节编译的,因此临时用户无法读取.
这应该比base64解码更安全 - 尽管它容易受到py_to_pyc反编译器的攻击.
如果您正在使用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
假设用户在运行时无法提供用户名和密码的最佳解决方案,可能是一个单独的源文件,仅包含导入主代码的用户名和密码的变量初始化.凭据更改时,只需要编辑此文件.否则,如果您只担心具有平均记忆的肩膀冲浪者,基本64编码可能是最简单的解决方案.ROT13太容易手动解码,不区分大小写并且在加密状态下保留太多含义.在python脚本之外编码您的密码和用户ID.他是否在运行时进行脚本解码以供使用.
为自动化任务提供脚本凭据始终是一个冒险的提议.您的脚本应该有自己的凭据,并且它使用的帐户应该没有其他所需的访问权限.至少密码应该很长而且是随机的.
如何从脚本外部的文件导入用户名和密码?这样即使有人掌握了脚本,他们也不会自动获取密码.
base64是满足您简单需求的方法.无需导入任何内容:
>>> 'your string'.encode('base64') 'eW91ciBzdHJpbmc=\n' >>> _.decode('base64') 'your string'
for python3 obfuscation using base64
is done differently:
import base64
base64.b64encode(b'PasswordStringAsStreamOfBytes')
which results in
b'UGFzc3dvcmRTdHJpbmdBc1N0cmVhbU9mQnl0ZXM='
note the informal string representation, the actual string is in quotes
and decoding back to the original string
base64.b64decode(b'UGFzc3dvcmRTdHJpbmdBc1N0cmVhbU9mQnl0ZXM=')
b'PasswordStringAsStreamOfBytes'
to use this result where string objects are required the bytes object can be translated
repr = base64.b64decode(b'UGFzc3dvcmRTdHJpbmdBc1N0cmVhbU9mQnl0ZXM=')
secret = repr.decode('utf-8')
print(secret)
for more information on how python3 handles bytes (and strings accordingly) please see the official documentation.