将密码存储在单独的文件中

78 投票
4 回答
111173 浏览
提问于 2025-04-18 18:32

存储Python脚本中的应用程序秘密(比如密码、访问令牌)最简单的方法是什么?我原以为可以用一个*.yml文件,就像在Ruby中那样,但让我惊讶的是,事实并不是这样。那么,应该用什么呢?最简单的解决方案是什么?

我想把这些秘密放在一个单独的文件里,这样我就可以不把这个文件上传到GitHub仓库。

4 个回答

0

可能我来得有点晚,但我还是想分享一种我觉得更简单的方法,而且不需要太多编码。

可以使用ini文件来存储你的秘密,像这样:

[section_name]
key1 = value1
key2 = value2

然后使用configparser这个库来读取ini文件,并从中提取不同的值。

除此之外,如果你只有几个变量需要处理,我觉得使用.env文件也可以。

在以上两种方法中,你可以通过在.gitignore文件中添加*.ini或*.env,确保你的秘密不会被意外上传到github上。

12

我个人比较喜欢用yaml文件,配合pyyaml这个库来使用。你可以在这里找到相关的文档:https://pyyaml.org/wiki/PyYAMLDocumentation

创建一个.gitignore规则非常简单,而且几乎不可能出错。在Linux或类似UNIX的系统中,你可以用echo命令快速添加这个规则:

echo -e '*.yaml\n*.yml' >> .gitignore

下面是一个从同一文件夹里的设置.yaml文件中获取设置的例子。

代码片段:

#!/usr/bin/env python3

import yaml
from pathlib import Path


def get_settings():
    full_file_path = Path(__file__).parent.joinpath('settings.yaml')
    with open(full_file_path) as settings:
        settings_data = yaml.load(settings, Loader=yaml.Loader)
    return settings_data
17

我之前也遇到过同样的问题,最后找到的解决办法和kecer提到的一样。因为我需要在很多脚本中使用这个方法,所以我自己创建了一个库。让我和你分享这个解决方案。

credlib.py -- 一个通用的库,用来处理凭证

class credential:
    def __init__(self, hostname, username, password):
        self.hostname = hostname
        self.username = username
        self.password = password

mycredentials.py -- 我本地的文件,用来存储所有的凭证

from credlib import credential
sys_prod = credential("srv01", "user", "pass")
sys_stg = credential("srv02", "user", "pass")
sys_db = credential("db01", "userdb", "passdb")

mysystemlib.py -- 这是一个通用库,用来访问我的系统(支持新的凭证系统和旧的系统)

from credlib import credential

def system_login(*args): # this is new function definition
#def system_login(hostname, username, password): # this was previous function definition

    if len(args) == 1 and isinstance(args[0], credential):
        hostname = args[0].hostname
        username = args[0].username
        password = args[0].password
    elif len(args) == 3:
        hostname = args[0]
        username = args[1]
        password = args[2]
    else:
        raise ValueError('Invalid arguments')

    do_login(hostname, username, password) # this is original system login call

main.py -- 主要的脚本,结合了凭证和系统库

from mycredentials import sys_stg, sys_db
import mysystemlib
...
mysystemlib.system_login(sys_stg)

请注意,旧的主机名/用户名/密码的方式仍然可以使用,所以不会影响旧的脚本:

mysystemlib.system_login("srv02", "user", "pass")

这个方法有很多好处:

  • 在我们所有的Python脚本中使用相同的凭证系统
  • 存放密码的文件是分开的(这些文件可以设置更严格的权限)
  • 文件不存储在我们的git仓库中(通过.gitignore排除),这样我们的Python脚本/库可以和别人分享,而不暴露凭证(每个人在自己的本地文件中定义自己的凭证)
  • 如果需要更改密码,我们只需在一个地方进行更改
113

我觉得把账号密码放在另一个 *py 文件里是最安全的做法。然后你只需要把这个文件导入就可以了。下面是一个例子:

config.py

username = "xy"
password = "abcd"

main.py

import config
login(config.username, config.password)

撰写回答