使用Python创建包含各种凭证的加密文件

时间:2019-06-08 13:13:03

标签: python encryption

我正在开发一个用Python 3编写的程序,用于使我们执行的许多任务自动化。当前,这些任务都是各自的程序,但是我打算最终在统一界面(考虑使用prompt-toolkit)下将它们一起移动。我当前的凭据解决方案只是一个creds.toml文件,每个所需的凭据都存储在其中:

[db_name]
user = "me"
pass = "changeme!"

我想做的是维护我的凭据具有的词典接口,但是将那些密码存储在加密的文件中。最终,我希望拥有它,以便通过我的程序添加凭据,因此根本不需要与该程序进行交互。我认为这对用户来说是最好的,因为我们的团队中混合了sysadmin,并且并非所有人都对CLI和与文本文件进行交互感到很自在(傻瓜的Windows人员;))。

对此,我最好的选择是什么?我最关心的是不小心查看对方的凭据,而不是关注其他任何东西。这将在NOC中使用,因此轮班共享相同的控制台,并且可以访问彼此的文件。必须进入他人的主目录来获取他们编写的脚本或拿起他们在轮班中未完成的工作,这很常见。

理想情况下,我的工作流程为:

s_creds = decrypt(file)
creds = pickle.load(s_data)
session = Database(creds['db_name']

Database类将包含:

def __init__(self, cred):
    ...
    self.user = cred['user']
    self.pass = cred['pass']
    ...

我最初以为该文件将是一个刚刚加密的toml文件。但是跳过它而只是序列化字典会更有意义。

不太关心许可证,但由于存在麻烦,我不希望使用GPLv3。

1 个答案:

答案 0 :(得分:1)

在编辑我为此项目创建的第一个实用程序时,我偶然发现了我最初的凭证存储方法keyring。该软件包允许将密码存储在本地计算机的密钥环,内存或加密文件中(使用另一个软件包keyring.cryptfile)。不过,由于凭据不是在字典中,而是在对象中,因此将需要重做一些工作。

使用keyring的方式类似于:

>> import keyring
>> svc = 'service_name'
>> usr = 'username'
>> pass = 'qwerty'
>> keyring.set_password(svc, usr, pass)
>> credentials = keyring.get_credential(svc, usr)
>> credentials._username
'username'
>> credentials._password
'qwerty'

通过让OS处理凭据的实际处理,我将比加密的文本文件更安全。这似乎是一个不错的解决方案,尽管我可以说“密码无所谓,但除了已经可以访问相同资源的人以外,其他人都看不到密码”,这是一厢情愿的想法,我应该对这句谚语更加谨慎。王国的钥匙”。