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

时间:2013-05-28 18:35:33

标签: python windows authentication passwords python-keyring

我正在与一个涉及连接数据库的同事开发脚本。我们希望保持代码独立于我们中的哪一个使用它,同时保持我们的密码私密,而不必在工作日期间反复进行身份验证。经过一些搜索(我们都是Python的新手)似乎我们可以为此目的使用密钥环,所以我从pip安装它(很可能是基于我的安装日期内存的1.2.2版本库)。 / p>

问题在于,当我尝试访问存储的密码时,系统会提示我设置主密码以访问密钥环,如下所示(来自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:

输入主密码后,此身份验证仅在当前会话期间/重新启动之间持续存在。从命令行运行脚本时,情况更糟 - 我必须在每次运行脚本时进行身份验证。在这一点上,密钥环不会节省我任何时间或精力,我怀疑它使我的密码更安全,而不是记忆和手动输入。

在搜索解决方案之后,如果主密码与用户帐户的密码相同,则密钥环将在Unix上自动进行身份验证,但这在Windows上不起作用。

我是否试图让keyring做一些不应该做的事情,或者我的实现中是否只是一个错误?

我的经验似乎与另一位用户报告的内容相冲突,该用户声称当应用程序尝试访问相关问题中的密钥环时,系统不会提示他输入密码,How does python-keyring work on Windows?

1 个答案:

答案 0 :(得分:1)

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

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

如果输出:

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

然后这就是它要求输入密码的原因。该模块未能找到任何特定于平台的密钥环,因此它只是使用主密码加密您的密码并将它们放入普通文件中。

就个人而言,对我来说更重要的是我的脚本无人值守而不是我的密码是安全的,所以我写了这个函数:

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(),如果您像我一样,不需要插入主密码而不是保留您的密码密码安全。在执行此操作之前,请了解以明文形式存储密码的安全隐患。

更好的长期解决方案是可能会调查所有其他可用的后端并安装正确的预先请求,以便可以使用另一个,如果存在不需要输入主密码而只是存在登录就足够了。