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

アレッ*_*ックス 32 python settings configuration

存储Python脚本的应用程序机密(密码,访问令牌)的最简单方法是什么?我认为它是一个*.yml类似于Ruby 的文件,但令人惊讶的是我发现事实并非如此.那么它是什么呢?什么是最简单的解决方案?

我想将它们放在一个单独的文件中,因为这样我就不能将该文件推送到github存储库.

kec*_*cer 44

我认为将凭证存储在另一个*py文件中是最安全的选择.然后只需导入它.示例看起来像这样

config.py

username = "xy"
password = "abcd"
Run Code Online (Sandbox Code Playgroud)

main.py

import config
login(config.username, config.password)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,config.py中的任意代码都将被执行.这是一个问题,特别是如果main.py运行在与config.py不同的信任区域中. (4认同)
  • @Jonathan在这种情况下,配置中的所有代码仍然运行。因此,如果您不信任“config.py”,那仍然有风险。如果您不像应用程序代码那样信任“config.py”,那么无论您如何调整它,这都是一种危险的方法。 (3认同)
  • 此外,在凭证文件上使用 *py 文件扩展名会使它更有可能被错误地推送到 gh 存储库! (2认同)

Cra*_*raZ 5

我处理的是完全相同的问题,实际上得到了与kecer建议的相同的解决方案。由于需要使用数十个脚本,因此我创建了自己的库。让我与您分享此解决方案。

credlib.py-处理凭证的通用库

class credential:
    def __init__(self, hostname, username, password):
        self.hostname = hostname
        self.username = username
        self.password = password
Run Code Online (Sandbox Code Playgroud)

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

from credlib import credential
sys_prod = credential("srv01", "user", "pass")
sys_stg = credential("srv02", "user", "pass")
sys_db = credential("db01", "userdb", "passdb")
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

from mycredentials import sys_stg, sys_db
import mysystemlib
...
mysystemlib.system_login(sys_stg)
Run Code Online (Sandbox Code Playgroud)

请注意,旧版主机名/用户名/密码方式仍然有效,因此不会影响旧脚本:

mysystemlib.system_login("srv02", "user", "pass")
Run Code Online (Sandbox Code Playgroud)

这有很多好处:

  • 我们所有python脚本中都使用相同的凭证系统
  • 带密码的文件分开(文件可以具有更严格的权限)
  • 文件没有存储在我们的git存储库中(通过排除.gitignore),因此我们的python脚本/库可以与其他人共享而无需暴露凭据(每个人都在本地文件中定义自己的凭据)
  • 如果需要更改密码,我们只能在一个地方进行

  • 在我们的例子中,我们的经验法则是将所有凭证文件命名为“cred_*.py”,这就是我们在 .gitignore 中的内容。当然,这并不能防止人为错误保存具有不同名称的凭证文件。尽管如此,我们从来没有遇到过这个问题。对我们来说最重要的是在单独的文件中分离代码和凭据。 (2认同)

Sco*_*ton 5

我个人更喜欢使用 yaml 文件和 pyyaml 库。此处的文档:https : //pyyaml.org/wiki/PyYAMLDocumentation

创建.gitignore规则非常快速且轻松,出错的可能性为零。您可以在类似 Linux / UNIX 的系统上添加带有 echo 的规则:

echo -e '*.yaml\n*.yml' >> .gitignore
Run Code Online (Sandbox Code Playgroud)

以下是从阅读器的同一文件夹/位置中的设置 .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
Run Code Online (Sandbox Code Playgroud)