如何讓Python不回顯獲取密碼輸入
導讀 |
密碼對程式設計師來說尤其重要。你不應該在不加密的情況下儲存它們,而且你也不應該在使用者輸入密碼的時候顯示出輸入的內容。當我決定要提高我的膝上型電腦的安全性時,這對我來說變得特別重要。我對我的家目錄進行了加密,但當我登入後,任何以純文字形式儲存在配置檔案中的密碼都有可能暴露在偷窺者面前。
|
用 GPG 和 Python 的 getpass 模組給你的密碼多一層安全保障。
具體來說,我使用一個名為 Mutt 的應用作為我的電子郵件客戶端。它可以讓我在我的 linux 終端中閱讀和撰寫電子郵件,但通常它希望在其配置檔案中有一個密碼。我限制了我的 Mutt 配置檔案的許可權,以便只有我可以看到它,我是我的膝上型電腦的唯一使用者,所以我並不真的擔心經過認證的使用者會無意中看到我的配置檔案。相反,我想保護自己,無論是為了吹噓還是為了版本控制,不至於心不在焉地把我的配置釋出到網上,把我的密碼暴露了。此外,雖然我不希望我的系統上有不受歡迎的客人,但我確實想確保入侵者不能透過對我的配置上執行 cat 就獲得我的密碼。
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
正如通常的情況一樣,有一個 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 命令結合起來。我為這個指令碼選擇了 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 模組可以提供幫助,這很容易實現。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2783179/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- input 密碼輸入框如何定位,並且輸入密碼呢?密碼
- jQuery 顯示 input 輸入的密碼!jQuery密碼
- Python內建庫:getpass(密碼輸入工具)Python密碼
- 如何使用Python獲取、寫入localStoragePython
- 一對一視訊原始碼,登入時輸入密碼時的顯示密碼按鈕原始碼密碼
- Flutter 密碼輸入框 驗證碼輸入框Flutter密碼
- python輸入錯誤密碼使用者鎖定Python密碼
- 不停要求輸入郵箱密碼如何解決密碼
- Python input()函式:獲取使用者輸入的字串Python函式字串
- 國外免費代理ip地址密碼如何獲取?密碼
- 輸入密碼檢視flag密碼
- 自定義支付密碼輸入view、密碼鍵盤並自動檢測6位密碼輸入完全密碼View
- python如何獲取陣列元素的下標並輸出Python陣列
- 直播商城原始碼,密碼輸入框自定義顯示隱藏圖示原始碼密碼
- 直播系統程式碼,輸入時實現密碼顯示與隱藏密碼
- 啟動軟體輸入密碼密碼
- 獲取input框輸入值異常
- Linux c程式中獲取shell指令碼輸出(如獲取system命令輸出)LinuxC程式指令碼
- 如何在 Linux 中不輸入密碼執行 sudo 命令Linux密碼
- python3中編碼如何獲取網頁?Python網頁
- python如何只獲取日期Python
- 直播app原始碼,登入時自動輸入密碼/自動記住密碼APP原始碼密碼
- win10如何輸入法顯示語言欄_讓win10輸入法顯示語言欄的步驟Win10
- git push要輸入密碼問題Git密碼
- 輸入密碼連線過程log密碼
- 無需輸入密碼,macOS 設定開機直接免密碼進入桌面密碼Mac
- Python如何獲取request response bodyPython
- python中獲取如何Series值Python
- python如何獲取本機ipPython
- macbook開機登入時輸入正確的密碼卻提示密碼錯誤Mac密碼
- jQuery獲取各種input輸入框的值jQuery
- 使用git時避免每次提交輸入密碼Git密碼
- appium 怎麼做到小程式輸入密碼APP密碼
- 瀏覽器儲存密碼獲取與解密瀏覽器密碼解密
- 密碼是如何被竊取的密碼
- Linux 下用 SCP 無需輸入密碼傳輸檔案Linux密碼
- python tkinter如何獲取label內容?Python
- python爬蟲如何獲取表情包Python爬蟲