如何从python中的osx keychain获取代理密码?

时间:2015-04-20 06:38:54

标签: python macos shell proxy keychain

目前我通过在python

中运行以下shell命令来获取密码

对于Http代理密码

security find-internet-password -s 192.168.1.38 -r htsx -P 808 -w

对于Https代理密码

security find-internet-password -s 192.168.1.38 -r htpx -P 808 -w

我通过运行以下代码获取所有主机名和端口

>>> import urllib
>>> urllib.getproxies()
{'http': 'http://192.168.1.38:808', 'https': 'http://192.168.1.38:808'}

但每次我从python运行上面的shell命令时,都会被要求允许"安全"要访问钥匙串,如果我给始终允许应用程序访问代理密码的钥匙串,那么代理密码甚至可以由我未明确允许的其他应用程序访问。他们可以通过运行相同的命令来访问代理密码(我已经从命令提示符尝试了它,这次它没有提示我并尝试从其他python脚本访问它也不是在向我许可)。

enter image description here

但是其他应用程序(如AuthBroker)在访问代理时显示以下消息

enter image description here

我知道我允许应用程序安全访问钥匙串,但其他应用程序正在请求自己的权限。我的方法可能会损害系统的安全性。

我有两个问题:

  1. 访问代理密码的钥匙串的推荐方法是什么?
  2. 是否有可以执行此操作的python库?

2 个答案:

答案 0 :(得分:1)

在Python中使用keyring库非常方便。安装对我来说微不足道:

$ sudo easy_install keyring

然后,使用此处所述的简单API:https://alexwlchan.net/2016/11/you-should-use-keyring/

$ python
>>> import keyring
>>> import getpass
>>> keyring.set_password('twitter', 'xkcd', getpass.getpass())
Password: 
>>> keyring.get_password('twitter', 'xkcd')
u'correct horse battery staple'

有关此密码背后的故事,请参见https://xkcd.com/936/。 :-)

我不确定这是否与您所指的代理密码完全集成,因为我只是用它来存储简单脚本的密码。

答案 1 :(得分:0)

在OS X上以任何语言执行此操作的建议方法是使用Keychain Services

Keychain Services提供了一个主要的C API,其文档仅适用于C,ObjC和Swift。上面链接的编程指南主要与语言无关,但是示例和函数引用的语法不会成为。

我相信'SecKeychainFindInternetPassword`是您想要的功能,但除非您先阅读背景信息,否则对您没有任何帮助。

据我所知,没有人为此发布过Python包装器。如果您熟悉PyObjC,我依旧记得PyObjC邮件列表中的一个帖子,其中某人包裹核心Keychain服务功能的方式与启动服务开箱即用相同。或者,由于API是纯C而不是ObjC,您可以通过ctypes访问它。

然而,最简单的解决方案可能是获得一个第三方ObjC包装器(我认为SSKeychain.frameworkKeychain.framework是每个人都使用的两个,但不要引用我的话)。然后,您可以使用PyObjC中的NSBundleNSClass API动态加载它们。当然,这确实意味着您需要分发该第三方框架,因此请务必检查许可证。

如果你谷歌搜索" Keychain Access Python"," SSKeychain Python"等,你会看到一些博客帖子,但它们似乎都已过时了几年(我找到的第一个与SSKeychain ...有一个死链接,所以我不确定他们会有多少帮助。