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