Linux中國

使用這個 Python 模塊輸入不可見的密碼

密碼對程序員來說尤其重要。你不應該在不加密的情況下存儲它們,而且你也不應該在用戶輸入密碼的時候顯示出輸入的內容。當我決定要提高我的筆記本電腦的安全性時,這對我來說變得特別重要。我對我的家目錄進行了加密,但當我登錄後,任何以純文本形式存儲在配置文件中的密碼都有可能暴露在偷窺者面前。

具體來說,我使用一個名為 Mutt 的應用作為我的電子郵件客戶端。它可以讓我在我的 Linux 終端中閱讀和撰寫電子郵件,但通常它希望在其配置文件中有一個密碼。我限制了我的 Mutt 配置文件的許可權,以便只有我可以看到它,我是我的筆記本電腦的唯一用戶,所以我並不真的擔心經過認證的用戶會無意中看到我的配置文件。相反,我想保護自己,無論是為了吹噓還是為了版本控制,不至於心不在焉地把我的配置發布到網上,把我的密碼暴露了。此外,雖然我不希望我的系統上有不受歡迎的客人,但我確實想確保入侵者不能通過對我的配置上運行 cat 就獲得我的密碼。

Python GnuPG

Python 模塊 python-gnupggpg 應用的一個 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 模塊可以提供幫助,這很容易實現。

via: https://opensource.com/article/21/7/invisible-passwords-python

作者:Seth Kenlon 選題:lujun9972 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國