避免以明文形式存储密码,以便通过Python访问IMAP

避免以明文形式存储密码,以便通过Python访问IMAP,python,imap,exchange-server,imaplib,Python,Imap,Exchange Server,Imaplib,我正试图编写一个脚本来帮助清除IMAP收件箱,但我遇到了密码问题;也就是说,要访问服务器,我需要访问明文。我已经检查过了,我的邮件服务器没有将MD5显示为可用方法(否则我可以使用IMAP4.login\u cram\u MD5)。如何在没有明文密码的情况下访问服务器?您可以像这样检查可用的身份验证方法(我使用的是IMAP4\u SSL,如果您想要不安全的连接,请使用IMAP4,但如果您有选择,我不建议使用非SSL连接) 然后,您可以为所选方法编写一个身份验证对象,该对象可以传递给imap\u s

我正试图编写一个脚本来帮助清除IMAP收件箱,但我遇到了密码问题;也就是说,要访问服务器,我需要访问明文。我已经检查过了,我的邮件服务器没有将MD5显示为可用方法(否则我可以使用
IMAP4.login\u cram\u MD5
)。如何在没有明文密码的情况下访问服务器?

您可以像这样检查可用的身份验证方法(我使用的是
IMAP4\u SSL
,如果您想要不安全的连接,请使用
IMAP4
,但如果您有选择,我不建议使用非SSL连接)

然后,您可以为所选方法编写一个身份验证对象,该对象可以传递给
imap\u server.authenticate()
。碰巧有一些使用它的例子,并显示有人通过OAuth对Gmail进行身份验证

如果服务器不提供除明文密码以外的任何身份验证方法,或者您不能/不希望支持这些方法,那么不幸的是,将密码存储在可以恢复明文的表单中是不可避免的。您可以以某种形式对其进行加密(例如,使用AES),但加密密钥仍将存储在某个位置,除非您每次都要提示用户(在这种情况下,您最好还是提示输入密码)。我建议至少进行一些琐碎的模糊处理,比如Base64编码,只是为了防止有人漫不经心地浏览代码或配置文件,清楚地看到密码


编辑:另一个显而易见的要点是,如果您确实需要存储明文密码,请确保您永远不会将其存储在需要全世界可读的文件中。例如,永远不要在脚本中硬编码它们,即使它只是一个快速脚本,它的所有其他设置都是全局变量或类似的。相反,请尝试确保密码位于一个单独的文件中,该文件可以根据需要限制特定于操作系统的权限。

您可以像这样检查可用的身份验证方法(我正在使用
IMAP4\u SSL
,如果您想要不安全的连接,请使用
IMAP4
,但如果您有选择,我不建议您使用非SSL连接)

然后,您可以为所选方法编写一个身份验证对象,该对象可以传递给
imap\U server.authenticate()
。碰巧有一些使用它的示例,并显示有人通过OAuth向Gmail进行身份验证

如果服务器不提供除明文密码以外的任何身份验证方法,或者您不能/不希望支持这些方法,那么不幸的是,将密码存储在可以恢复明文的形式中是不可避免的。您可以以某种形式对其进行加密(例如,使用AES),但加密密钥仍将存储在某个位置,除非您每次都要提示用户(在这种情况下,您最好还是提示输入密码)。我建议至少进行一些琐碎的模糊处理,例如Base64编码,以防止有人漫不经心地浏览代码或配置,从而清楚地看到密码


编辑:另一点可能很明显,那就是确保如果您确实需要存储明文密码,您永远不会将它们存储在需要全世界可读的文件中。例如,永远不要在脚本中硬编码它们,即使它只是一个快速脚本,其所有其他设置都作为全局变量或类似设置。Instead,请尝试确保密码位于一个单独的文件中,该文件可以根据需要限制操作系统特定的权限。

不客气,很抱歉,我没有更好的解决方案。我只是修改了我的回答,同时提到将密码保留在源代码之外(可能很明显,但我认为这一点非常重要)。非常感谢;我现在已经这么做了。什么是最佳实践呢?将这些文件放在git repos中(当然不是面向公众的文件)?将密码存储在git存储库中?最佳实践是“不要”。如果可能,将其作为一个本地配置,永远不会离开当前计算机。如果需要,您可以始终在Git中使用一个虚拟默认值,并在每次签出时使用真实密码进行本地未提交的更改-您可以始终将其隐藏以执行其他工作,然后取消隐藏。如果确实必须将密码存储在Gi中t、 请确保它至少是经过普通加密的(例如Base64)并保存在它自己的文件中。避免在进行任何其他更改时提交对该文件的更改。不客气,很抱歉,我没有更好的解决方案。我只是修改了我的回答,同时提到将密码保留在源代码之外(可能很明显,但我认为这一点很重要)。感谢你,我现在已经在这么做了。最佳实践是什么?将这些文件放在git repos中(当然不是面向公众的文件)?将密码存储在git存储库中?最佳实践是“不要”。如果可能,将其作为一个本地配置,永远不会离开当前计算机。如果需要,您可以始终在Git中使用一个虚拟默认值,并在每次签出时使用真实密码进行本地未提交的更改-您可以始终将其隐藏以执行其他工作,然后取消隐藏。如果确实必须将密码存储在Gi中t、 确保它至少是经过普通加密的(例如Base64)并且在它自己的文件中。避免将任何其他更改提交到该文件中。
import imaplib
imap_server = imaplib.IMAP4_SSL("imap.server.com")
print "\n".join(i for i in imap_server.capabilities if i.startswith("AUTH="))