我写了一个小python应用程序,使用密钥环模块(用于在Windows凭证保险库中存储密码)自动登录用户到特定服务,并使用wxpython登录gui。 此服务的登录工具不支持登录凭据的存储,但具有我在脚本中使用的cmd登录方法。
脚本现在已经完成并且工作正常,但我想将其作为exe部署到其他几个系统。
Keyring似乎与pyinstaller没什么关系,但是在添加了大量隐藏导入后,我的程序开始了至少:
'json',
'json.decoder',
'json.encoder',
'json.scanner',
'keyring.backends.file',
'keyring.backends.Gnome',
'keyring.backends.Google',
'keyring.backends.keyczar',
'keyring.backends.kwallet',
'keyring.backends.multi',
'keyring.backends.OS_X',
'keyring.backends.pyfs',
'keyring.backends.SecretService',
'keyring.backends.Windows',
'keyring.backends._win_crypto',
'keyring.util.escape',
'keyring.util.XDG',
'keyring.credentials'
应用程序启动时没有任何错误的模块丢失,但在尝试访问凭证保险库时仍然崩溃:
c:\PY\novell_login>dist\thread_test\thread_test.exe
Logging in User: test
Traceback (most recent call last):
File "c:\PY\build\thread_test\out00-PYZ.pyz\wx._core", line 16766, in <lambda>
File "<string>", line 119, in LongTaskDone
File "c:\PY\build\thread_test\out00-PYZ.pyz\keyring.core", line 44, in set_password
File "c:\PY\build\thread_test\out00-PYZ.pyz\keyring.backends.file", line 87, in set_password
File "c:\PY\build\thread_test\out00-PYZ.pyz\keyring.backends.Windows", line 81, in encrypt
NameError: global name '_win_crypto' is not defined
我不知道还有什么可以解决这个问题...... 任何人都可以帮我正确地包括密钥环或知道我可以使用的替代品。我真的想继续使用windows crendential金库存储密码。
谢谢!
Python:2.7.9 pyinstaller:2.1 密钥环:5.6 pywin:Build 219
答案 0 :(得分:1)
经过一周没有成功,即使在这里发布并在pyinstaller github上我做了我自己的解决方案。 我放弃了密钥环模块并使用win32crypt模块来使用windows函数CryptProtectData,经过一些研究后使用了与密钥环相同的保护。
我将密码哈希到存储在用户appdata文件夹中的字符串中,并在需要时解密。这很好用,应该像密钥环方法一样安全,因为它只能从同一个用户解密,重置密码才能获得访问权限。对我来说足够安全。
当然这适用于pyinstaller。