安全性 - 在python脚本中隐藏密码(仅限不安全的混淆)
我有一个python脚本正在创建一个ODBC连接。 使用连接字符串生成ODBC连接。 在此连接字符串中,我必须包含此连接的用户名和密码。
是否有一种简单的方法可以在文件中隐藏此密码(只是在我编辑文件时没有人能读取密码)?
16个解决方案
100 votes
Base64编码在标准库中,可以阻止肩膀冲浪:
>>> import base64
>>> print base64.b64encode("password")
cGFzc3dvcmQ=
>>> print base64.b64decode("cGFzc3dvcmQ=")
password
Dave Webb answered 2019-06-26T22:42:40Z
48 votes
当您需要为远程登录指定密码时,Douglas F Shearer是Unix中普遍认可的解决方案。
您可以添加--password-from-file选项以指定路径并从文件中读取明文。
然后,该文件可以位于由操作系统保护的用户自己的区域中。它还允许不同的用户自动获取自己的文件。
对于不允许脚本用户知道的密码 - 您可以使用elavated权限运行脚本,并拥有该root / admin用户拥有的密码文件。
Martin Beckett answered 2019-06-26T22:43:24Z
39 votes
这是一个简单的方法:
创建一个python模块 - 让我们称之为peekaboo.py。
在peekaboo.py中,包括密码和需要该密码的任何代码
创建一个编译版本 - peekaboo.pyc - 通过导入这个模块(通过python命令行等...)。
现在,删除peekaboo.py。
你现在可以愉快地导入peekaboo仅依靠peekaboo.pyc。 由于peekaboo.pyc是字节编译的,因此临时用户无法读取。
这应该比base64解码更安全 - 尽管它容易受到py_to_pyc反编译器的攻击。
manyPartsAreEdible answered 2019-06-26T22:44:30Z
25 votes
如果您正在使用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
jonasberg answered 2019-06-26T22:45:01Z
18 votes
假设用户和密码不能由用户在运行时给出,最佳解决方案可能是一个单独的源文件,仅包含导入主代码的用户名和密码的变量初始化。 凭据更改时,只需要编辑此文件。 否则,如果您只担心具有平均记忆的肩膀冲浪者,那么base 64编码可能是最简单的解决方案。 ROT13太容易手动解码,不区分大小写并且在其加密状态中保留太多含义。 在python脚本之外编码您的密码和用户ID。 他是否在运行时进行脚本解码以供使用。
为自动化任务提供脚本凭据始终是一个冒险的提议。 您的脚本应该有自己的凭据,并且它使用的帐户应该没有其他所需的访问权限。 至少密码应该很长而且是随机的。
tduehr answered 2019-06-26T22:45:33Z
16 votes
如何从脚本外部的文件导入用户名和密码? 这样即使有人掌握了脚本,他们也不会自动获取密码。
Douglas F Shearer answered 2019-06-26T22:45:57Z
15 votes
base64是满足您简单需求的方法。 无需导入任何内容:
>>> 'your string'.encode('base64')
'eW91ciBzdHJpbmc=\n'
>>> _.decode('base64')
'your string'
tzot answered 2019-06-26T22:46:21Z
4 votes
这是一个非常常见的问题。 通常,您可以做的最好的事情就是
A)创建某种ceasar密码函数来编码/解码(只是不腐烂13)要么B)首选方法是使用加密密钥,在程序可及范围内对密码进行编码/解码。 您可以使用文件保护来保护访问密钥。 如果您的应用程序作为服务/守护程序(如Web服务器)运行,那么您可以将密钥放入受密码保护的密钥库中,并将密码输入作为服务启动的一部分。 它会让管理员重新启动您的应用程序,但您可以很好地保护您的配置密码。
answered 2019-06-26T22:46:52Z
2 votes
您的操作系统可能提供安全加密数据的工具。 例如,在Windows上有DPAPI(数据保护API)。 为什么不在第一次运行时询问用户他们的凭据然后将它们加密以便随后运行?
Jamie Eisenhart answered 2019-06-26T22:47:16Z
2 votes
更多本土appraoch,而不是将身份验证/密码/用户名转换为加密的详细信息。 FTPLIB就是一个例子。" pass.csv" 是csv文件名
将密码保存为CSV,如下所示:
用户名
用户密码
(没有列标题)
读取CSV并将其保存到列表中。
使用List元素作为验证详细信息。
完整代码。
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])
LonelySoul answered 2019-06-26T22:48:28Z
2 votes
对于使用base64进行python3混淆的方式不同:
import base64
base64.b64encode(b'PasswordStringAsStreamOfBytes')
结果
b'UGFzc3dvcmRTdHJpbmdBc1N0cmVhbU9mQnl0ZXM='
请注意非正式字符串表示,实际字符串是引号
并解码回原始字符串
base64.b64decode(b'UGFzc3dvcmRTdHJpbmdBc1N0cmVhbU9mQnl0ZXM=')
b'PasswordStringAsStreamOfBytes'
要在需要字符串对象的地方使用此结果,可以转换字节对象
repr = base64.b64decode(b'UGFzc3dvcmRTdHJpbmdBc1N0cmVhbU9mQnl0ZXM=')
secret = repr.decode('utf-8')
print(secret)
有关python3如何处理字节(以及相应的字符串)的更多信息,请参阅官方文档。
jitter answered 2019-06-26T22:49:20Z
1 votes
将配置信息放在加密的配置文件中。 使用密钥在代码中查询此信息。 将此密钥放在每个环境的单独文件中,不要将其与代码一起存储。
FlySwat answered 2019-06-26T22:49:44Z
1 votes
如果在Windows上运行,您可以考虑使用win32crypt库。 它允许运行脚本的用户存储和检索受保护的数据(密钥,密码),因此密码永远不会以明文或模糊的格式存储在代码中。 我不确定是否有其他平台的等效实现,所以严格使用win32crypt你的代码是不可移植的。
我相信这个模块可以在这里获得:[http://timgolden.me.uk/pywin32-docs/win32crypt.html]
VilleLipponen answered 2019-06-26T22:50:16Z
0 votes
在网络上用Python编写了几个ROT13实用程序 - 只为他们谷歌。 ROT13将字符串脱机编码,将其复制到源中,在传输点解码。
但这真的是弱保护......
Kevin Little answered 2019-06-26T22:50:47Z
0 votes
你知道坑吗?
[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
TakesxiSximada answered 2019-06-26T22:51:35Z
0 votes
这并没有准确回答你的问题,但它是相关的。 我打算添加评论,但不允许。我一直处理同样的问题,我们决定使用Jenkins向用户公开脚本。 这允许我们将数据库凭据存储在一个单独的文件中,该文件在服务器上加密和保护,非管理员无法访问。它还允许我们创建UI和限制执行的快捷方式。
Joe Hayes answered 2019-06-26T22:51:59Z