安全地存储用于python脚本的密码

安全地存储用于python脚本的密码,python,security,Python,Security,可能重复: 我正在寻找一种安全存储密码的方法,我打算在一些Python脚本中使用这种方法。我将登录不同的东西,我不想在脚本本身中以明文形式存储密码 相反,我想知道是否有任何东西能够安全地存储这些密码,然后使用主密码之类的东西检索它们,我可以在脚本开始时输入主密码。我通常有一个secrets.py,它与我的其他python脚本分开存储,并且不受版本控制。然后,无论何时需要,您都可以从机密导入执行。通过这种方式,您可以依赖内置文件安全系统中的操作系统,而无需重新发明自己的系统 使用Base64编码

可能重复:

我正在寻找一种安全存储密码的方法,我打算在一些Python脚本中使用这种方法。我将登录不同的东西,我不想在脚本本身中以明文形式存储密码


相反,我想知道是否有任何东西能够安全地存储这些密码,然后使用主密码之类的东西检索它们,我可以在脚本开始时输入主密码。

我通常有一个
secrets.py
,它与我的其他python脚本分开存储,并且不受版本控制。然后,无论何时需要,您都可以从机密导入执行
。通过这种方式,您可以依赖内置文件安全系统中的操作系统,而无需重新发明自己的系统

使用
Base64
编码/解码也是混淆密码的另一种方法,尽管它并不完全安全


更多信息-

自己知道主密钥。不要硬编码

使用
py bcrypt
(bcrypt),这是一种强大的哈希技术,可以自己生成密码

基本上你可以做到这一点(一个想法…)

将salt和hash密码保存在某个地方,这样无论何时需要使用密码,您都可以读取加密的密码,并根据您再次输入的原始密码进行测试


这就是目前登录的基本工作方式。

安全的方法是通过AES加密您的敏感数据,加密密钥是通过基于密码的密钥派生函数(PBE)派生,PBE是用于加密/解密AES加密密钥的主密码

主密码->安全密钥->使用密钥加密数据

你可以用

确保存储salt/iv/passphrase,并使用相同的salt/iv/passphase进行解密


Weblogic使用了类似的方法来保护配置文件中的密码

您可以将密码存储在使用GPG加密的文本(例如JSON)文件中,然后让脚本在每次运行时运行GPG对其进行解密。另请参阅:@DietrichEpp,这要求脚本具有GPG解密机密。由于脚本很容易被解析,攻击者可以恢复GPG机密,然后恢复您的密码。@chessofnerd:不,这不是真的。不需要在脚本中存储解密密钥。相反,您可以让GPG提示用户输入密码,也可以使用后台运行的代理。Base64编码密码从来都不是一个好主意。它只会给人一种安全感的错觉。不要这样做。这取决于你是在防御低技术攻击还是高技术攻击。有时在工程上没有意义。这不需要任何人使用脚本来创建自己的
机密.py
?我只生成小的Python脚本(工具)并将它们存储在我们公司的git服务器中。我也使用这个解决方案,但我不想把所有密码都推到git中。因此,我的
secrets.py
仅存储在本地。推送到git的版本只是一个空模板,没有真正的密码。@Stevoisiak,是的。这是正确的。我要做的一件事是将敏感数据存储在可供用户使用的配置文件中。配置文件位于程序旁边,因此程序总是知道在哪里可以找到它。这样,我的用户就可以在配置文件中乱搞,而不是在python文件中乱搞(这对他们来说可能更容易一些)。
raw\u password
在您的示例中是未定义的。它指的是什么?我真的不知道如何使用它?我设想
raw\u password
是最初应该存储的密码,用户希望使用
master\u secret\u key
salt
获取此密码。但是您声明必须读取散列密码并根据
raw\u password
进行测试,但是
raw\u password
是未知的!?问题是:如何提取
原始密码
给定的
主密钥
salt
?这确实没有回答OP问题。此答案不适用于存储用于检索的密码。。。此答案用于检查有人在脚本中输入的密码。OP想要(和我一样)一个关于如何存储和检索密码的答案。例如,我想安全地存储我的Gmail密码供我的脚本使用……这在2020年仍然是一种良好的做法和安全的做法。如果其他人在>=2020年遇到此问题,我在这里用一个更完整/正确的例子做了一个要点:你能给出一个与加密例子一起解密的例子吗?这里有一个很好的解密例子:
import bcrypt
from getpass import getpass
master_secret_key = getpass('tell me the master secret key you are going to use')
salt = bcrypt.gensalt()
combo_password = raw_password + salt + master_secret_key
hashed_password = bcrypt.hashpw(combo_password, salt)
from PBKDF2 import PBKDF2
from Crypto.Cipher import AES
import os
salt = os.urandom(8)    # 64-bit salt
key = PBKDF2("This passphrase is a secret.", salt).read(32) # 256-bit key
iv = os.urandom(16)     # 128-bit IV
cipher = AES.new(key, AES.MODE_CBC, iv)