首页 / 知识
Python 模块之输入不可见的密码
2023-11-12 13:38:00
密码对程序员来说尤其重要。你不应该在不加密的情况下存储它们,而且你也不应该在用户输入密码的时候显示出输入的内容。当我决定要提高我的笔记本电脑的安全性时,这对我来说变得特别重要。我对我的家目录进行了加密,但当我登录后,任何以纯文本形式存储在配置文件中的密码都有可能暴露在偷窥者面前。
具体来说,我使用一个名为Mutt的应用作为我的电子邮件客户端。它可以让我在我的Linux终端中阅读和撰写电子邮件,但通常它希望在其配置文件中有一个密码。我限制了我的Mutt配置文件的权限,以便只有我可以看到它,我是我的笔记本电脑的唯一用户,所以我并不真的担心经过认证的用户会无意中看到我的配置文件。相反,我想保护自己,无论是为了吹嘘还是为了版本控制,不至于心不在焉地把我的配置发布到网上,把我的密码暴露了。此外,虽然我不希望我的系统上有不受欢迎的客人,但我确实想确保入侵者不能通过对我的配置上运行cat就获得我的密码。
pythonGnuPG
Python模块python-gnupg是gpg应用的一个Python封装。该模块的名字是python-gnupg,你不要把它和一个叫做gnupg的模块混淆。
GnuPG(GPG)是Linux的默认加密系统,我从2009年左右开始使用它。我对它很熟悉,对它的安全性有很高的信任。
我决定将我的密码输入Mutt的最好方法是将我的密码存储在一个加密的GPG文件中,创建一个提示我的GPG密码来解锁这个加密文件,然后将密码交给Mutt(实际上是交给offlineimap命令,我用它来同步我的笔记本和电子邮件服务器)。
用Python获取用户输入是非常容易的。对input进行调用,无论用户输入什么,都会被存储为一个变量:
print("Enterpassword:")
myinput=input()
print("Youentered:",myinput)
我的问题是,当我根据密码提示在终端上输入密码时,我所输入的所有内容对任何从我肩膀上看过去或滚动我的终端历史的人来说都是可见的:
$./test.py
Enterpassword:my-Complex-Passphrase
用getpass输入不可见密码
正如通常的情况一样,有一个Python模块已经解决了我的问题。这个模块是getpass4,从用户的角度来看,它的行为和input完全一样,只是不显示用户输入的内容。
你可以用pip安装这两个模块:
$python-mpipinstall--userpython-gnupggetpass4
下面是我的Python脚本,用于创建密码提示:
#!/usr/bin/envpython
#bySethKenlon
#GPLv3
#installdeps:
#python3-mpipinstall--userpython-gnupggetpass4
importgnupg
importgetpass
frompathlibimportPath
defget_api_pass():
homedir=str(Path.home())
gpg=gnupg.GPG(gnupghome=os.path.join(homedir,".gnupg"),use_agent=True)
passwd=getpass.getpass(prompt="EnteryourGnuPGpassword:",stream=None)
withopen(os.path.join(homedir,'.mutt','pass.gpg'),'rb')asf:
apipass=(gpg.decrypt_file(f,passphrase=passwd))
f.close()
returnstr(apipass)
if__name__=="__main__":
apipass=get_api_pass()
print(apipass)
如果你想试试,把文件保存为password_prompt.py。如果你使用offlineimap并想在你自己的密码输入中使用这个方案,那么把它保存到某个你可以在.offlineimaprc文件中指向offlineimap的位置(我使用~/.mutt/password_prompt.py)。
测试密码提示
要查看脚本的运行情况,你首先必须创建一个加密文件(我假设你已经设置了GPG):
$echo"helloworld">pass
$gpg--encryptpass
$mvpass.gpg~/.mutt/pass.gpg
$rmpass
现在运行Python脚本:
$python~/.mutt/password_prompt.py
EnteryourGPGpassword:
helloworld
当你输入时没有任何显示,但只要你正确输入GPG口令,你就会看到该测试信息。
将密码提示符与offlineimap整合起来
我需要将我的新提示与offlineimap命令结合起来。我为这个脚本选择了Python,因为我知道offlineimap可以对Python程序进行调用。如果你是一个offlineimap用户,你会明白唯一需要的“整合”是在你的.offlineimaprc文件中改变两行。
首先,添加一行引用Python文件的内容:
pythonfile=~/.mutt/password_prompt.py
然后将.offlineimaprc中的remotepasseval行改为调用password_prompt.py中的get_api_pass()函数:
remotepasseval=get_api_pass()
配置文件中不再有密码!
安全问题
在你的个人电脑上考虑安全问题有时会让人觉得很偏执。你的SSH配置是否真的需要限制为600?隐藏在名为.mutt的无关紧要的电子邮件密码真的重要吗?也许不重要。
然而,知道我没有把敏感数据悄悄地藏在我的配置文件里,使我更容易把文件提交到公共Git仓库,把片段复制和粘贴到支持论坛,并以真实好用的配置文件的形式分享我的知识。仅就这一点而言,安全性的提高使我的生活更加轻松。而且有这么多好的Python模块可以提供帮助,这很容易实现。
以上内容为大家介绍了Python模块之输入不可见的密码,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们http://www.mobiletrain.org/
最新内容
相关内容
Python系统互动
Python系统互动,互动,系统,管理,通信,标准,管理系统,培训,操作系统,功能,进程,系统互动,主要指Python和操作系统(operatesystem)、文件系统(fipython操作系统接口模块:OS
python操作系统接口模块:OS,管理,工作,工具,系统,服务,培训,模块,文件,目录,函数,OS模块提供了很多与操作系统进行交互的函数,比如常见的使用函使用Python执行系统命令方法
使用Python执行系统命令方法,系统,信息,培训,标准,命令,方法,模块,操作,终端,中文,Python是一款操作简单的编程语言,内置丰富的库,能够很容易的基于 Python K-近邻算法的手写识别
基于 Python K-近邻算法的手写识别系统,数据,数字,分析,培训,系统,算法,近邻,测试,样本,图形,这里我们一步步的构造使用k-近邻分类器的手写识python如何读取列表中元素的位置?
python如何读取列表中元素的位置?,位置,数据,异常,培训,字符串,元素,索引,方法,示例,结果,python读取列表中元素位置的方法:1、使用index()方怎么查看python模块在什么位置
怎么查看python模块在什么位置,位置,代码,培训,模块,路径,下面,以上,文件,方法,更多,查看python模块在什么位置的方法:若要获取模块的文件名为怎么找到苹果电脑 python安装位置
怎么找到苹果电脑 python安装位置,系统,位置,培训,版本,苹果电脑,终端,路径,命令,里面,以上,Mac系统自带python路径为:/System/Library/Framepython 培训之 object是什么类型
python 培训之 object是什么类型,培训,类型,实例,顶端,对象,关系,链条,父子,数据类型,属性,在Python的世界中,object是父子关系的顶端,所有的数python注释一般放在什么位置
python注释一般放在什么位置,代码,位置,培训,注释,时间,引号,可能会,不可或缺,变量,语句,python写代码注释是一件很重要的事情,如果你写的一段python怎么抛出异常信息
python怎么抛出异常信息,异常,代码,信息,基础,检测,培训,语句,发生,程序,除数,当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行python有必要去培训机构学习么
python有必要去培训机构学习么,培训,分析,环境,工作,面临,情况,社会,领导,培训班,以上,我是一新手学习Python有需要去培训的必要吗?我想这也python新手如何系统学习
python新手如何系统学习,基础,系统,状态,环境,中级,培训,阶段,代码,概念,管理,我们可把学习python分为4个阶段,每个阶段需要完善的掌握知识点,p