100

可能重复:
我需要在 Python 中安全地存储用户名和密码,我有哪些选择?

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

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

4

3 回答 3

47

自己知道万能钥匙。不要硬编码。

使用py-bcrypt(bcrypt),强大的散列技术自己生成密码。

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

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)

将盐和散列密码保存在某处,因此每当您需要使用密码时,您都在读取加密密码,并针对您再次输入的原始密码进行测试。

这基本上就是这些天登录应该如何工作的方式。

于 2012-08-21T00:52:29.837 回答
21

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

使用Base64编码/解码也是另一种混淆密码的方法,虽然不完全安全

更多信息 -在 python 脚本中隐藏密码(仅限不安全的混淆)

于 2012-08-20T18:47:53.797 回答
9

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

主密码->安全密钥->通过密钥加密数据

您可以使用pbkdf2

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)

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

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

于 2012-08-21T01:30:19.180 回答