密码对程序员来说尤其重要。你不应该在不加密的情况下存储它们,而且你也不应该在用户输入密码的时候显示出输入的内容。当我决定要提高我的笔记本电脑的安全性时,这对我来说变得特别重要。我对我的家目录进行了加密,但当我登录后,任何以纯文本形式存储在配置文件中的密码都有可能暴露在偷窥者面前。

用 GPG 和 Python 的 getpass 模块给你的密码多一层安全保障。

具体来说,我使用一个名为 Mutt 的应用作为我的电子邮件客户端。它可以让我在我的 Linux 终端中阅读和撰写电子邮件,但通常它希望在其配置文件中有一个密码。我限制了我的 Mutt 配置文件的权限,以便只有我可以看到它,我是我的笔记本电脑的唯一用户,所以我并不真的担心经过认证的用户会无意中看到我的配置文件。相反,我想保护自己,无论是为了吹嘘还是为了版本控制,不至于心不在焉地把我的配置发布到网上,把我的密码暴露了。此外,虽然我不希望我的系统上有不受欢迎的客人,但我确实想确保入侵者不能通过对我的配置上运行 cat 就获得我的密码。

Python GnuPG

Python 模块 python-gnupg 是 gpg 应用的一个 Python 封装。该模块的名字是 python-gnupg,你不要把它和一个叫做 gnupg 的模块混淆。

GnuPG(GPG) 是 Linux 的默认加密系统,我从 2009 年左右开始使用它。我对它很熟悉,对它的安全性有很高的信任。

我决定将我的密码输入 Mutt 的最好方法是将我的密码存储在一个加密的 GPG 文件中,创建一个提示我的 GPG 密码来解锁这个加密文件,然后将密码交给 Mutt(实际上是交给 offlineimap 命令,我用它来同步我的笔记本和电子邮件服务器)。

用 Python 获取用户输入 是非常容易的。对 input 进行调用,无论用户输入什么,都会被存储为一个变量:

print("Enter password: ")
myinput = input()
print("You entered: ", myinput)

我的问题是,当我根据密码提示在终端上输入密码时,我所输入的所有内容对任何从我肩膀上看过去或滚动我的终端历史的人来说都是可见的:

$ ./test.py
Enter password: my-Complex-Passphrase

用 getpass 输入不可见密码

正如通常的情况一样,有一个 Python 模块已经解决了我的问题。这个模块是 getpass4,从用户的角度来看,它的行为和 input 完全一样,只是不显示用户输入的内容。

你可以用 pip 安装这两个模块:

$ python -m pip install --user python-gnupg getpass4

下面是我的 Python 脚本,用于创建密码提示:

#!/usr/bin/env python
# by Seth Kenlon
# GPLv3
# install deps:
# python3 -m pip install --user python-gnupg getpass4
import gnupg
import getpass
from pathlib import Path
def get_api_pass(): homedir = str(Path.home()) gpg = gnupg.GPG(gnupghome=os.path.join(homedir,".gnupg"), use_agent=True) passwd = getpass.getpass(prompt="Enter your GnuPG password: ", stream=None) with open(os.path.join(homedir,'.mutt','pass.gpg'), 'rb') as f: apipass = (gpg.decrypt_file(f, passphrase=passwd)) f.close() return str(apipass) if __name__ == "__main__": apipass = get_api_pass() print(apipass)

如果你想试试,把文件保存为 password_prompt.py。如果你使用 offlineimap 并想在你自己的密码输入中使用这个方案,那么把它保存到某个你可以在 .offlineimaprc 文件中指向 offlineimap 的位置(我使用 ~/.mutt/password_prompt.py)。

测试密码提示

要查看脚本的运行情况,你首先必须创建一个加密文件(我假设你已经设置了 GPG):

$ echo "hello world" > pass
$ gpg --encrypt pass
$ mv pass.gpg ~/.mutt/pass.gpg
$ rm pass

现在运行 Python 脚本:

$ python ~/.mutt/password_prompt.py
Enter your GPG password:
hello world

当你输入时没有任何显示,但只要你正确输入 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不回显获取密码输入相关推荐

  1. python的输入函数是什么意思_在Python中,用于获取用户输入的函数是

    在Python中,用于获取用户输入的函数是 Whichofthefollowingmodernfarmtoolsaredevelopedbasedonpushsickle?A:Reaper.B:Gra ...

  2. 在python中用于获取用户输入的是-在Python中,用于获取用户输入的函数是

    在Python中,用于获取用户输入的函数是 Whichofthefollowingmodernfarmtoolsaredevelopedbasedonpushsickle?A:Reaper.B:Gra ...

  3. python中用于获取用户输入的函数是_在Python中,用于获取用户输入的函数是.

    在Python中,用于获取用户输入的函数是. 答:input() 关于新生儿生理性体重下降的恢复时间,下列正确的是出生后 答:7~10天 中国大学MOOC: 未来城市只有同时具备下列哪几个组成部分,才 ...

  4. python处理回显_Python中getpass模块无回显输入源码解析

    本文主要讨论了python中getpass模块的相关内容,具体如下. getpass模块 昨天跟学弟吹牛b安利Python标准库官方文档的时候偶然发现了这个模块.仔细一看内容挺少的,只有两个主要api ...

  5. [转载] 【基础教程】Python input()函数:获取用户输入的字符串

    参考链接: 从Python中控制台获取输入 input() 是 Python 的内置函数,用于从控制台读取用户输入的内容.input() 函数总是以字符串的形式来处理用户输入的内容,所以用户输入的内容 ...

  6. python语言怎么输入-Python input()函数:获取用户输入的字符串

    input() 是 Python 的内置函数,用于从控制台读取用户输入的内容.input() 函数总是以字符串的形式来处理用户输入的内容,所以用户输入的内容可以包含任何字符. input() 函数的用 ...

  7. 简单的python流回显服务器与客户端

    环境:Fedora12 + python2.6.2 server.py #!/usr/bin/python import socket srvsock = socket.socket(socket.A ...

  8. python输入变量_Python如何获取用户输入

    本文首发于公众号「猿天罡」,转载请注明出处,谢谢! 有时候,我们编写的程序需要从用户那儿"拿到"一些数据才能继续执行下去,比如,判断某人是否到了法定投票年龄,需要用户自己输入名字和 ...

  9. python 输入密码不显示_Python开发实例:隐藏输入密码时屏幕回显

    登录账号密码的时候,账号可以回显在屏幕上,但是对于比较隐私的项目例如密码最好是不要再屏幕上回显.就像我们再终端登录linux服务器的时候,输入信息的时候只显示用户名,而不显示登录密码. 以下是Pyth ...

最新文章

  1. 最新消息!腾讯紧急宣布再度延期复工时间到24号!附各大企业最新复工时间表...
  2. 大学python用什么教材-python大学里用哪本教材比较好?
  3. windows下安装RabbitMQ消息服务器 + 读写队列
  4. Redis的存储(实现)原理
  5. mysqladmin 设置用户名初始密码报错you need the SUPER privilege for this operation
  6. python字符串的表示_Python字符串方法总结
  7. JavaFX 8的弹出式编辑器
  8. leetcode 77. 组合 思考分析
  9. sdut 数字三角形问题
  10. C 标准IO 库函数与Unbuffered IO函数
  11. 服务器芯片组c621,三路千兆LAN:GIGABYTE 技嘉 发布 C621-SU8 服务器主板
  12. 论文阅读笔记——人脸网络:人脸识别和聚类的统一嵌入
  13. Java并发编程实战_《Java并发编程实战》PDF版本下载
  14. ExcelToSQLServer-批量导入Excel文件到SQL Server数据库
  15. 对涉密计算机检查内容,保密工作检查内容主要有哪些
  16. credential provider filter注意
  17. linux通讯录软件带头像,Ubuntu联系人应用已支持增强的头像功能
  18. 如何查看网易云笔记自己曾经使用过的设备
  19. Java基础-常见IO五种模型
  20. 道可云元宇宙每日资讯|济南发布促进元宇宙产业创新发展行动计划

热门文章

  1. 工欲善其事,必先利其器。如何玩转 VS Code?
  2. 解读 | 2019 年 10 篇计算机视觉精选论文
  3. 【每日一算法】最常见的单词
  4. 如何安装树莓派摄像头
  5. 用户变量和系统变量的区别
  6. 绝望,上传文件失败。。遇到并解决java.lang.NullPointerException
  7. 工业机器人抓取时怎么定位的?用什么传感器来检测?
  8. 【OpenCV 4开发详解】图像金字塔
  9. 一起学微软Power BI系列-使用技巧(3)Power BI安卓手机版安装与体验
  10. SDCC 2016 中国软件开发者大会盛大开幕