有没有一种方法来访问Windows中的密钥环而不提供主密码?

我正在开发一个涉及连接到数据库的同事的脚本。 我们希望保持代码不依赖于我们中的哪一个人使用它,同时保持密码的私密性,而不必在工作日内反复validation。 经过一番search(我们都是Python的新手),似乎我们可以使用keyring来实现这个目的,所以我使用pip安装了它(根据我的安装datelogging,很可能是1.2.2版本的库)。

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

 >>> ================================ 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: 

input主密码后,该authentication仅在当前会话/重新启动之间持续存在。 从命令行运行脚本时,情况更糟 – 每次脚本运行时都必须进行身份validation。 在这一点上,钥匙圈并不会节省我的时间和精力,而且我怀疑这会让我的密码更加安全,而不是记忆和手动input。

在search解决scheme后,如果主密码与用户帐户的密码相同,看起来密钥环将在Unix上自动进行身份validation,但这在Windows上不适用于我。

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

我的经验似乎与另一个用户声称相冲突,他声称当应用程序尝试访问相关问题中的密钥环时,他没有被提示input密码, python-keyring如何在Windows上工作?

Solutions Collecting From Web of "有没有一种方法来访问Windows中的密钥环而不提供主密码?"

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

 >>> 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()) 

在使用keyring来设置set_passwordget_password之前,如果你像我一样,运行这个函数configureKeyring() ,不需要插入一个主密码来保证你的密码安全。 请在这之前了解您以纯文本形式存储密码的安全含义。

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