python - 有没有办法在不提供主密码的情况下访问 Windows 中的 key 环?

标签 python windows authentication passwords python-keyring

我正在与同事开发一个涉及连接到数据库的脚本。我们希望让代码独立于我们中的哪一个人使用它,同时将我们的密码保密并且不必在工作日期间一遍又一遍地进行身份验证。经过一些搜索(我们都是 Python 的新手),我们似乎可以为此目的使用 key 环,所以我从 pip 安装了它(根据我对安装日期的内存,最有可能是库的 1.2.2 版本)。

问题是当我尝试访问我存储的密码时,系统提示我设置一个主密码来访问 key 环,如下所示(来自 IDLE):

>>> import keyring
>>> keyring.set_password('Service', 'MyUsername', 'MyPassword')

Warning (from warnings module):
  File "C:\Python27\lib\getpass.py", line 92
  return fallback_getpass(prompt, stream)
GetPassWarning: Can not control echo on the terminal.
Warning: Password input may be echoed.
Please enter password for encrypted keyring:

设置密码后,我可以轻松获取和设置密码,直到我重新启动 shell。现在我必须再次输入主密码:

>>> ================================ RESTART ================================
>>> import keyring
>>> print keyring.get_password('Service', 'MyUsername')

Warning (from warnings module):
  File "C:\Python27\lib\getpass.py", line 92
    return fallback_getpass(prompt, stream)
GetPassWarning: Can not control echo on the terminal.
Warning: Password input may be echoed.
Please enter password for encrypted keyring:

输入主密码后,此身份验证仅在当前 session 期间/重启之间持续存在。从命令行运行脚本时,情况更糟——每次运行脚本时我都必须进行身份验证。在这一点上, key 环并没有为我节省任何时间或精力,我怀疑它是否能让我的密码比内存和手动输入更安全。

搜索解决方案后,如果主密码与用户帐户的密码相同, key 环似乎会在 Unix 上自动进行身份验证,但这对我在 Windows 上不起作用。

我是想让 key 环做一些它不应该做的事情,还是我的实现有错误?

我的经历似乎与另一位用户报告的经历相冲突,该用户声称当应用程序试图访问相关问题中的 key 环时,他没有被提示输入密码,How does python-keyring work on Windows?

最佳答案

您使用的是哪个后端?检查使用:

>>> from keyring import get_keyring
>>> get_keyring()
[... what is output here?]

如果它输出这个:

<keyring.backends.file.EncryptedKeyring object at 0x.....>

这就是它请求密码的原因。该模块找不到任何平台特定的 key 环来使用,因此它只是使用主密码加密您的密码并将它们放入普通文件中。

就我个人而言,我的脚本在无人值守的情况下运行比我的密码安全更重要,所以我编写了这个函数:

def configureKeyring():
    """
    EncryptedKeyring requires a master password to unlock it, which is not ideal
    for our scripts since we want them to run unattended. So if we're using
    EncryptedKeyring, automatically swap to a PlaintextKeyring instead.

    If we're using something else, say WinVaultKeyring, then that's more secure
    than PlaintextKeyring without being any less convenient, so we'll use it.
    """
    from keyring               import get_keyring, set_keyring
    from keyring.backends.file import EncryptedKeyring, PlaintextKeyring

    if isinstance(get_keyring(), EncryptedKeyring):
        set_keyring(PlaintextKeyring())

在您使用keyringset_passwordget_password 之前,请运行此函数configureKeyring(),如果您,像我一样,重视不需要插入主密码而不是保证密码安全。在执行此操作之前,请了解以明文形式存储密码的安全隐患。

一个更好的长期解决方案可能是调查所有其他可用的后端并安装适当的先决条件,以便可以使用不同的先决条件,如果存在一个你不需要输入主密码并且只是被登录就足够了。

注:来自https://build.opensuse.org/package/view_file/openSUSE:Leap:42.2/python-keyring/python-keyring.changes?rev=a2e727a9e4a21a65c9496362d8cff27d

As these keyrings have moved, any keyrings indicated explicitly in configuration will need to be updated to replace "keyring.backends." with "keyrings.alt.". For example, "keyring.backends.file.PlaintextKeyring" becomes "keyrings.alt.file.PlaintextKeyring"

因此,根据已提供的解决方案中的版本,您可能必须这样做

from keyrings.alt.file import EncryptedKeyring, PlaintextKeyring 

关于python - 有没有办法在不提供主密码的情况下访问 Windows 中的 key 环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16799049/

相关文章:

java - 如何向运行 solr 的 Jetty Web 服务器添加自定义身份验证

python - 什么相当于 pytorch 在 tensorflow 中的 torch.nn.CosineEmbeddingLoss?

python - pip-compile 如何管理其输入和输出文件?

python - 为什么子类不会覆盖 python 中基类的字段以及如何处理

c++ - 是否有用于使用 Cygwin GCC 编译的 C++ 程序的免费内存调试器?

angularjs - 如何使用satellizer在angularjs中获取经过身份验证的用户的电子邮件

python - 如何检测哪些快捷键映射到 Vim 中的特定命令?

c - 在 Windows 上使用 C 中的线程。简单的例子?

c++ - 在资源管理器中打开

authentication - JWT 可以是有状态的吗?