17

python-keyring 如何在 Windows 上提供安全性?

在 Linux 上的 GNOME/KDE 中,系统会提示用户输入他的密码,以根据每个应用程序授权访问密钥环。

在 Windows 中,当应用程序访问密钥环时没有这样的提示。什么是阻止随机 python 应用程序通过运行从密钥环中检索密码

import keyring
get_password(service, username)

用户同意如何实施?整个概念,至少在 Windows 中,是否基于所有已安装程序都是“受信任”的假设?

4

3 回答 3

24

稍微研究一下,密码似乎存储在 Windows Credential Vault 中,这相当于 Gnome 或 KDE 密钥环。您实际上可以通过打开 Windows 凭据管理器查看已存储的那些。我只需Credential Manager从开始屏幕输入 Windows 8.1 即可到达那里,但我认为您也可以从用户帐户页面访问它。

无论如何,正如您从所附图像中看到的那样,我作为测试添加到密钥环的密码显示在Windows Credentials -> Generic Credentials -> keyring_demo. 在 PC 上以其他用户身份打开此窗口不会显示此密码,因此它似乎对其他用户是安全的。此屏幕还允许您撤销或更改密码。

Windows 凭据管理器

至于如何实现同意,我相信keyring只要您的 Windows 用户帐户登录就可以运行,但我不知道具体情况。

于 2015-06-11T14:30:41.713 回答
1

凭证管理器方法有效,但在我的情况下添加:

  • 互联网或网络地址“myPassGroup”
  • 用户名“pass1”
  • 密码“xxx”

然后使用相同的网络地址添加另一个条目

  • 互联网或网络地址“myPassGroup”
  • 用户名“pass2”
  • 密码“xxx”

pass2 将覆盖第一个条目pass1!这是一个主要缺点,因为“互联网或网络地址”在密钥环中用作组名,我需要将多个密码放在同名下

我的解决方案是直接使用python命令

  • 在 Windows 中打开 CMD
  • 键入 Python
  • 然后输入导入密钥环
  • 然后输入 keyring.set_password("groupName", "passKey" ,"password")
  • 然后输入 keyring.set_password("groupName", "passKey2" ,"password2")

您可以通过以下方式验证结果

  • keying.get_password("groupname", "passKey")
  • keying.get_password("groupname", "passKey2")

我知道这会起作用,但仍然很难找到实际数据的保存位置

我使用以下命令尝试找出

  • python -c“导入keyring.util.platform_;打印(keyring.util.platform_.config_root())”

  • python -c "导入 keyring.util.platform_; print(keyring.util.platform_.data_root())"

在我的情况下,data_root 是“C:\Users\JunchenLiu\AppData\Local\Python Keyring” 我检查了文件夹,它不存在......它必须保存在某个地方。也许有人可以弄清楚。

但我的解决方案应该可以在 Windows 上完美运行

于 2018-04-13T21:48:46.853 回答
-9
from keyring.backend import KeyringBackend

class SimpleKeyring(KeyringBackend):
    """Simple Keyring is a keyring which can store only one
    password in memory.
    """
    def __init__(self):
        self.password = ''

    def supported(self):
        return 0

    def get_password(self, service, username):
        return self.password

    def set_password(self, service, username, password):
        self.password = password
        return 0

    def delete_password(self, service, username):
        self.password = None
于 2013-09-24T04:14:08.200 回答