跳转到主要内容

安全存储和访问您的密码。

项目描述

https://img.shields.io/pypi/v/keyring.svg https://img.shields.io/pypi/pyversions/keyring.svg tests Ruff https://readthedocs.org/projects/keyring/badge/?version=latest https://img.shields.io/badge/skeleton-2024-informational https://tidelift.com/badges/package/pypi/keyring Join the chat at https://gitter.im/jaraco/keyring

Python keyring库提供了一个简单的方法从Python访问系统密钥环服务。它可以用于任何需要安全密码存储的应用程序。

以下推荐的密钥环后端得到支持

其他密钥环实现可通过 第三方后端 获取。

安装 - Linux

在Linux上,KWallet后端依赖于 dbus-python,当使用pip时(需要编译),它并不总是正确安装。为了获得最佳效果,请将dbus-python安装为系统包。

兼容性 - macOS

macOS密钥链支持macOS 11(Big Sur)及更高版本,需要Python 3.8.7或更高版本以及“universal2”二进制文件。有关详细信息,请参阅 #525

使用Keyring

keyring的基本用法非常简单:只需调用 keyring.set_passwordkeyring.get_password

>>> import keyring
>>> keyring.set_password("system", "username", "password")
>>> keyring.get_password("system", "username")
'password'

命令行工具

密钥环(Keyring)提供了一个与包一同安装的密钥环(keyring)命令。在大多数环境中安装密钥环后,该命令可用于设置、获取和删除密码。获取更多信息,请不带参数或使用 --help 选项调用。

$ keyring --help
$ keyring set system username
Password for 'username' in 'system':
$ keyring get system username
password

命令行功能也作为可执行包提供,适合像这样从Python调用:

$ python -m keyring --help
$ python -m keyring set system username
Password for 'username' in 'system':
$ python -m keyring get system username
password

Tab自动补全

如果通过包管理器(apt、pacman、nix、homebrew等)安装,这些shell补全可能已经与包一起分发(无需采取行动)。

如果安装了 completion 扩展,密钥环提供Tab自动补全功能。

$ pip install 'keyring[completion]'

然后,生成shell补全,例如

$ keyring --print-completion bash | sudo tee /usr/share/bash-completion/completions/keyring
$ keyring --print-completion zsh | sudo tee /usr/share/zsh/site-functions/_keyring
$ keyring --print-completion tcsh | sudo tee /etc/profile.d/keyring.csh

注意/usr/share 路径主要用于GNU/Linux。对于其他操作系统,请考虑以下选项:

  • macOS(Homebrew x86):/usr/local/share

  • macOS(Homebrew ARM):/opt/homebrew/share

  • Android(Termux):/data/data/com.termux/files/usr/share

  • Windows(mingw64 of msys2):/mingw64/share

在安装shell补全后,根据您的shell推荐的说明启用它们。例如:

  • bash:安装 bash-completion,并确保 . /usr/share/bash-completion/bash_completion~/.bashrc 中。

  • zsh:确保 autoload -Uz compinit && compinit 出现在 ~/.zshrc 中,然后 grep -w keyring ~/.zcompdump 以验证keyring是否存在,表示它已正确安装。

配置

python keyring库包含对几个后端的实现。库将尝试自动为当前环境选择最合适的后端。用户也可以通过配置文件或调用 set_keyring() 函数指定首选密钥环。

配置文件路径

配置存储在名为“keyringrc.cfg”的文件中,该文件位于特定于平台的存储位置。要确定配置文件的存储位置,请运行 keyring diagnose

配置文件内容

要指定密钥环后端,将 default-keyring 选项设置为该后端类的完整路径,例如 keyring.backends.macOS.Keyring

如果指定了 keyring-path,密钥环将在加载后端之前将该路径添加到Python模块搜索路径。

例如,此配置可能用于从 ./demo 目录中的 simplekeyring 模块加载 SimpleKeyring(未实现)。

[backend]
default-keyring=simplekeyring.SimpleKeyring
keyring-path=demo

第三方后端

除了核心密钥环包提供的后端,用于最常见和安全用例外,还有其他用例的密钥环后端实现。只需安装它们即可使其可用。

编写自己的密钥环后端

后端接口由 keyring.backend.KeyringBackend 定义。每个后端都应该从该基类派生,并定义一个 priority 属性和三个函数: get_password()set_password()delete_password()。如果需要,还可以定义 get_credential() 函数。

请参阅 backend 模块以了解该类接口的更多详细信息。

Keyring使用入口点来允许任何第三方包在不修改keyring本身的情况下实现后端。有兴趣创建新后端的人应鼓励在 keyrings 命名空间中创建新的第三方包,方式模仿 keyrings.alt 包。查看该项目中的 setup.cfg 文件以获取如何创建必需的入口点的提示。证明至关重要的后端可以考虑包含在核心库中,尽管安装这些第三方包的便利性意味着扩展可能易于获得。

要为Keyring创建扩展,请提交一个拉取请求,以便将您的扩展列为可用扩展。

运行时配置

Keyring还允许通过调用api set_keyring() 对后端进行编程配置。随后将使用指定的后端来存储和检索密码。

要调用 set_keyring

# define a new keyring class which extends the KeyringBackend
import keyring.backend

class TestKeyring(keyring.backend.KeyringBackend):
    """A test keyring which always outputs the same password
    """
    priority = 1

    def set_password(self, servicename, username, password):
        pass

    def get_password(self, servicename, username):
        return "password from TestKeyring"

    def delete_password(self, servicename, username):
        pass

# set the keyring for keyring lib
keyring.set_keyring(TestKeyring())

# invoke the keyring lib
try:
    keyring.set_password("demo-service", "tarek", "passexample")
    print("password stored successfully")
except keyring.errors.PasswordSetError:
    print("failed to store password")
print("password", keyring.get_password("demo-service", "tarek"))

禁用Keyring

在许多情况下,卸载keyring永远不会是必要的。特别是在Windows和macOS上,keyring的行为通常是退化的,这意味着它将向调用者返回空值,允许调用者回退到其他行为。

在某些情况下,keyring的默认行为可能是不受欢迎的,最好是完全禁用keyring行为。有多种机制可以禁用keyring

  • 卸载keyring。大多数应用程序可以容忍keyring未安装。卸载keyring应导致这些应用程序回退到没有keyring的行为。此方法会影响keyring可能已安装的Python环境。

  • 在环境中配置Null密钥环。设置 PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring,并将使用 Null(退化的)后端。此方法会影响设置该变量的所有Keyring使用。

  • 通过运行 keyring --disablepython -m keyring --disable 永久为用户配置Null密钥环。此方法会影响该用户的所有keyring使用。

修改Keyring行为

Keyring提供了一种通过环境变量修改keyring行为的机制。每个后端实现了一个 KeyringBackend.set_properties_from_env,当调用时,将查找以 KEYRING_PROPERTY_{NAME} 开头的所有环境变量,并将为每个 {NAME.lower()} 在keyring上设置一个属性。此方法在默认/配置的keyring初始化期间被调用。

此机制可用于在各个密钥环上设置一些有用的值,包括

  • keychain; macOS,到备用密钥链文件的路径

  • appid;Linux/SecretService,应用程序的备用ID

在Ubuntu 16.04上使用Keyring

以下是在Ubuntu 16.04虚拟环境中安装keyring的完整记录。没有使用配置文件。

$ sudo apt install python3-venv libdbus-glib-1-dev
$ cd /tmp
$ pyvenv py3
$ source py3/bin/activate
$ pip install -U pip
$ pip install secretstorage dbus-python
$ pip install keyring
$ python
>>> import keyring
>>> keyring.get_keyring()
<keyring.backends.SecretService.Keyring object at 0x7f9b9c971ba8>
>>> keyring.set_password("system", "username", "password")
>>> keyring.get_password("system", "username")
'password'

在无头Linux系统上使用Keyring

在Linux系统上(没有X11服务器可用)也可以使用SecretService后端(只需要D-Bus)。在这种情况下

  • 安装GNOME Keyring守护进程。

  • 启动一个D-Bus会话,例如运行dbus-run-session -- sh,并在该shell中运行以下命令。

  • 使用gnome-keyring-daemon命令并带有--unlock选项。该选项的描述说明

    从stdin读取密码,并使用它来解锁登录密钥环或创建它(如果登录密钥环不存在)。

    启动该命令后,在stdin中输入密码,然后按Ctrl+D(数据结束)。之后,守护进程将进入后台(使用--foreground选项来阻塞)。

  • 现在您可以使用Keyring的SecretService后端。请记住,在同一个D-Bus会话中运行您的应用程序,与守护进程相同。

在Docker容器中使用无头Linux系统上的Keyring

您还可以在Docker容器中使用带有SecretService后端的keyring。您需要做的只是安装必要的依赖项,并将–privileged标志添加到其中,以避免在尝试解锁系统密钥环时出现任何Operation not permitted错误。

以下是安装keyring在Ubuntu 18:04容器上的完整记录。

docker run -it -d --privileged ubuntu:18.04

$ apt-get update
$ apt install -y gnome-keyring python3-venv python3-dev
$ python3 -m venv venv
$ source venv/bin/activate # source a virtual environment to avoid polluting your system
$ pip3 install --upgrade pip
$ pip3 install keyring
$ dbus-run-session -- sh # this will drop you into a new D-bus shell
$ echo 'somecredstorepass' | gnome-keyring-daemon --unlock # unlock the system's keyring

$ python
>>> import keyring
>>> keyring.get_keyring()
<keyring.backends.SecretService.Keyring object at 0x7f9b9c971ba8>
>>> keyring.set_password("system", "username", "password")
>>> keyring.get_password("system", "username")
'password'

集成

API

keyring库有几个函数

  • get_keyring():返回当前加载的密钥环实现。

  • get_password(service, username):返回存储在活动密钥环中的密码。如果密码不存在,则返回None。

  • get_credential(service, username):返回存储在活动密钥环中的凭证对象。该对象至少包含usernamepassword属性,对于指定的服务,返回的username可能不同于参数。

  • set_password(service, username, password):将密码存储在密钥环中。

  • delete_password(service, username):删除密钥环中存储的密码。如果密码不存在,将引发异常。

在所有情况下,参数(serviceusernamepassword)应该是Unicode文本。

异常

keyring库引发以下异常

  • keyring.errors.KeyringError:keyring库中所有异常的基类。

  • keyring.errors.InitError:当密钥环无法初始化时引发。

  • keyring.errors.PasswordSetError:当无法在密钥环中设置密码时引发。

  • keyring.errors.PasswordDeleteError:当无法在密钥环中删除密码时引发。

参与其中

Python keyring库是一个开放的社区项目,热切欢迎贡献者。

安全考虑

在使用此库之前,每个内置后端可能都有需要了解的安全考虑因素。鼓励使用 keyring 的工具或库的作者考虑这些关注点。

与任何已知安全问题的列表一样,此列表不是详尽的。可以根据需要添加额外的问题。

  • macOS密钥链
    • 任何Python脚本或应用程序都可以访问由 keyring 创建的秘密,而无需操作系统提示用户输入密码。要使任何特定秘密在每次访问时都提示输入密码,请使用 Keychain Access 应用程序查找凭证,然后在 访问控制 设置中从允许的应用程序列表中移除 Python

  • Freedesktop秘密服务
    • 尚未进行分析

  • KDE4 & KDE5 KWallet
    • 尚未进行分析

  • Windows凭证存储库
    • 尚未进行分析

制作发布版本

本项目利用自动发布和持续集成。简单的流程是标记提交并将其推送到GitHub。如果它通过CI中的测试,它将被自动部署到PyPI。

发布时需要考虑的其他事项

  • 请确保变更日志适用于预期的发布版本。

运行测试

测试在GitHub Actions中持续运行。

要在本地运行测试,请安装并调用 tox

背景

本项目基于Tarek Ziade在此帖子中的想法。Kang Zhang最初将其作为Google Summer of Code项目实施,Tarek在该项目中指导Kang。

企业版

作为Tidelift订阅的一部分提供。

本项目以及成千上万的其它包的维护者正在与Tidelift合作,提供一项企业订阅,涵盖您使用的所有开源软件。

了解更多.

项目详情


发布历史 发布通知 | RSS订阅

下载文件

下载适用于您平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。

源代码分发

keyring-25.4.1.tar.gz (62.5 kB 查看哈希值)

上传时间 源代码

编译分发

keyring-25.4.1-py3-none-any.whl (38.9 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面