翻譯|行業資訊|編輯:周思宇|2023-05-30 15:14:33.110|閱讀 147 次
概述:本章介紹如何創建密碼短語生成器,歡迎查閱!
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
JetBrains是一家尖端的軟件供應商,專門創建智能開發工具,包括IntelliJ IDEA--領先的Java IDE,以及Kotlin編程語言。無論你的團隊是大是小,我們的產品將確保其在構建和發送代碼、計劃工作和協作時始終有一個順利和愉快的體驗。無論你用什么平臺或語言工作,JetBrains都有適合你的開發工具。
PyCharm是一種Python IDE,其帶有一整套可以幫助用戶在使用Python語言開發時提高其效率的工具。此外,該IDE提供了一些高級功能,以用于Django框架下的專業Web開發。
本文將展示如何使用免費的 PyCharm Community Edition 開發簡單的 CLI 應用程序來自動執行日常任務。 雖然在本教程結束時您將獲得一個可用的密碼短語生成器,但請僅將其視為一個學習項目。 切勿使用此生成器生成的密碼短語保護任何真實數據。
我們每天都會使用很多密碼。 注冊使用服務或網站時,您都需要創建一個長而獨一無二的密碼,包含數字、特殊字符、大寫字母等。
這些要求都是為了使密碼能夠抵抗暴力攻擊。 暴力攻擊基本上是多次嘗試猜測密碼,直到最終猜對為止。 需要多少嘗試和多長時間取決于密碼的長度和復雜度。
密碼短語是由多個隨機單詞組成的密碼。 它不需要有意義,也不需要符合語法規則。 密碼短語通常包含 4 到 5 個單詞,越多越好。 例如,PhysicianBuiltHotPotatoRegularly 就是一個密碼短語。
A^1rL#2k2oPiA9H 是一個安全系數高的好密碼。 它包含大小寫字母、數字、特殊符號,長度為 15 個字符。 但是您更愿意記住哪個,A^1rL#2k2oPiA9H 還是 PhysicianBuiltHotPotatoRegularly? 順便說一下,后者有 32 個字符。
除了記住密碼的難易程度之外,我們還應該注意破解密碼的難易程度。 來看下表:
A^1rL#2k2oPiA9H | PhysicianBuiltHotPotatoRegularly | |
符號集大小 | 95 | 52 |
密碼長度 | 15 | 32 |
破解所需的嘗試次數 | 2 98 | 2 182 |
兩者都很強,但密碼短語安全系數更高且更好記。 另外,如果在密碼短語中添加一些數字和特殊字符,這將使所需的平均猜測次數增加到 2210 次 – 幾乎不可能破解!
綜上:
通常,密碼短語生成器是一種將隨機單詞組合成偽句來生成密碼的程序。 在本教程中,我們將使用 PyCharm 和 Typer 開發一個命令行工具,它將執行以下操作:
工具不會存儲您的密碼短語。
首次啟動 PyCharm 時,您會看到歡迎屏幕。 點擊 New Project:
如果 PyCharm 已經在運行,可以從主菜單中選擇 File | New Project。
在 “New Project”窗口打開后,找到頂部的 Location字段,使用它指定項目的目錄。 這也將用作項目名稱。
您可以選擇 PyCharm 將在其中安裝項目依賴項的虛擬環境的類型。 您還可以選擇創建環境的位置,以及基礎 Python 解釋器。
選擇首選環境類型并指定選項(或保留默認值),然后點擊 Create(創建)。
PyCharm 將創建包含虛擬環境的項目目錄(在我們的示例中為 venv)。 如果您在上一步中沒有清除 Create a main.py welcome script 復選框,它也會創建 main.py 并在編輯器中將其打開:
文件包含帶有一些基本指令的“Hello World”腳本。 將以下代碼復制到剪貼板:
def main(): print("Hello World") if __name__ == "__main__": typer.run(main)
轉到 PyCharm,按 ?A / Ctrl+A,然后按 ?V / Ctrl+V 替換 main.py 的內容。 您將得到:
您可以看到 ”typer“按鈕下方有一條紅色波浪線。 這表示 Python 解釋器無法識別 Type。 我們需要安裝此軟件包并將其導入 main.py 才能啟動腳本。
將鼠標指針懸停在高亮顯示的符號上,然后在彈出窗口中選擇 Install and import package ‘typer’(安裝并導入軟件包 ‘typer’):
PyCharm 會將 Typer 軟件包安裝到項目環境中,并將其導入 main.py。
現在,我們可以運行腳本了。 點擊裝訂區域中的運行圖標,選擇 Run ‘main’:
帶有“Hello World”的 運行工具窗口將在底部打開:
修改代碼,讓它打印密碼短語而不是“Hello World”。 這里的想法是隨機挑選單詞并組成短語。 因此,我們需要一個或多個可供選擇的單詞列表。 您可以手動準備這樣的列表,也可以使用大型語言模型生成。
創建單詞列表時,請確保它們的安全性。 如果惡意行為者訪問了單詞列表,他們將能夠在幾秒鐘內破解您的密碼。
在這一步中,您需要包含 4 個單詞的列表:
每個列表中的單詞越多,腳本能夠生成的組合就越多。 每個單詞都應另起一行。
將生成或下載的單詞列表復制到項目目錄。 如果您想手動創建單詞列表,可以在 PyCharm 中進行:
項目結構應該如下所示:
首先,需要從文本文件讀取單詞。 將 print("Hello World") 替換為以下代碼:
sub_nouns = read_words('sub_nouns.txt')
同樣,read_words 下方有一條紅色波浪線。 我們需要創建這個函數。 將鼠標懸停在 read_words 上,然后在彈出窗口中點擊 Create function ‘read_words’(創建函數 ‘read_words’):
PyCharm 將創建一個函數存根。 指定 file_name 為函數形參,然后按 Tab 鍵開始編寫函數代碼:
您可以將高亮顯示的代碼復制到函數體中:
def read_words(file_name): with open(file_name, 'r') as f: words = f.readlines() return words
該函數將打開名稱在第一個形參中提供的文件。 然后,它會應用 readlines() 方法,這將返回包含文件行作為其元素的 Python 列表。 列表被保存到 words 變量中并由函數返回。
我們回到 main() 函數,使用新創建的 read_words 函數讀取另外 3 個單詞列表:
def main(): sub_nouns = read_words('sub_nouns.txt') verbs = read_words('verbs.txt') adjectives = read_words('adjectives.txt') obj_nouns = read_words('obj_nouns.txt')
接下來,創建一個單詞列表的列表,將其命名為 word_bank。 稍后,我們將在為密碼短語選擇隨機單詞時迭代它:
word_bank = [sub_nouns, verbs, adjectives, obj_nouns]
選擇的隨機單詞將被保存到另一個列表中。 把它命名為 phrase_words 并進行初始化:
phrase_words = []
在接下來的 for 循環中,我們迭代 word_bank 的條目。 word_bank 中的每個條目都是一個包含單詞的列表。 我們從內置 random 模塊中調用 SystemRandom() 類的 choice() 方法,從列表中選擇一個隨機單詞。 然后,將所選單詞追加到 phrase_words:
for word_list in word_bank: random_word = random.SystemRandom().choice(word_list) phrase_words.append(random_word)
雖然 random 是內置模塊,但我們還是需要導入它。 像之前一樣,您可以通過編輯器中的紅色波浪線來判斷。 將鼠標懸停在它上面,選擇 Import this name(導入此名稱)。
最后,使用 join 將包含隨機選擇單詞的列表轉換成短語并打印結果:
passphrase = ''.join(phrase_words) print(passphrase)
main() 在這個階段應該是這樣的:
def main(): sub_nouns = read_words('sub_nouns.txt') verbs = read_words('verbs.txt') adjectives = read_words('adjectives.txt') obj_nouns = read_words('obj_nouns.txt') word_bank = [sub_nouns, verbs, adjectives, obj_nouns] phrase_words = [] for word_list in word_bank: random_word = random.SystemRandom().choice(word_list) phrase_words.append(random_word) passphrase = ''.join(phrase_words) print(passphrase)
現在,運行腳本來檢查它是否正常運作。 點擊裝訂區域中的 Run圖標,并選擇 Run ‘main’(運行 ‘main’),您應該得到:
現在已經有了 4 個單詞,但它絕對不是短語。 當代碼正常工作但產生意外結果時,就需要進行調試。
從當前輸出可以看到,腳本成功從單詞列表選擇了隨機單詞。 它沒有做到的是將單詞組合成短語。 main() 的倒數第二行似乎是問題根源:
def main(): ... passphrase = ''.join(phrase_words) print(passphrase)
為了查看特定代碼行生成的結果,我們應該在該行上放置一個斷點。 然后,調試器將在執行帶有斷點的行之前停止。 要設置斷點,請點擊要檢查的行旁邊的裝訂區域:
要開始調試過程,像之前一樣點擊裝訂區域中的 Run圖標,但這次,在彈出窗口中選擇 Debug ‘main’(調試 ‘main’)。 調試器將在斷點處啟動并停止執行,在底部打開 Debug(調試)工具窗口:
在 Debug(調試)工具窗口的右側窗格中,您可以看到目前為止已賦值的變量。 展開 phrase_words 來查看其中的內容:
列表中有 4 個類型為 str 的條目。 每個字符串都以新行('\n') 結尾。 因此,后續將這些字符串連接在一起打印時,每個單詞都打印在單獨的行中。
如果查看其他列表,例如 adjectives,可以發現其中的所有條目也都以 ‘n’ 結尾。 我們從 read_words 函數獲取這些列表。 這意味著我們需要修正它,讓它返回沒有尾隨 ‘n’ 的單詞列表。
讓我們使用 strip() 和列表推導式,在返回之前去除每個列表條目中的 ‘n’:
def read_words(file_name): with open(file_name, 'r') as f: words = f.readlines() words = [word.strip() for word in words] return words
重新運行 main(),獲得結果:
以上便是使用PyCharm創建密碼短語生成器的上篇教程,下篇教程我們繼續講解如何創建更好的密碼短語。如果您有其他問題也可以繼續瀏覽本系列文章,獲取相關教程,你還可以給我留言或者加入我們的官方技術交流群。
歡迎下載|體驗更多Jetbrains產品
獲取更多信息請咨詢 ;Jetbrains技術交流群(QQ):786598704
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn