有没有一种方法可以在不提供主密码的情况下访问Windows中的keyring?

2024-04-26 06:34:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在和一个同事开发一个涉及到数据库连接的脚本。我们想让代码独立于我们使用它的人,同时保持我们的密码是私有的,并且不必在工作日中反复验证。经过一些搜索(我们都是Python的新手),似乎可以使用keyring来实现这个目的,所以我从pip安装了它(很可能是库的1.2.2版本,基于我对安装日期的记忆)。在

问题是,当我尝试访问我存储的密码时,系统会提示我设置一个主密码来访问keyring,如下所示(从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。现在我必须再次输入主密码:

^{pr2}$

输入主密码后,此身份验证仅在当前会话/重新启动之间持续。从命令行运行脚本时,更糟糕的是,每次运行脚本时,我都要进行身份验证。在这一点上,keyring并没有为我节省任何时间或精力,我怀疑它是否会使我的密码比记忆和手动输入更安全。在

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

我是想让keyring做一些它不想做的事情,还是我的实现中有一个错误?在

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


Tags: 记忆代码用户脚本身份验证数据库密码on
1条回答
网友
1楼 · 发布于 2024-04-26 06:34:09

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

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

如果输出:

^{pr2}$

那就是为什么它要请求密码。该模块找不到任何特定于平台的keyring来使用,因此它只是使用主密码加密您的密码,并将它们放入一个普通文件中。在

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

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()。在执行此操作之前,请理解您以明文形式存储密码的安全含义。在

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

相关问题 更多 >