基于Python實(shí)現(xiàn)密碼生成與管理工具(進(jìn)階版)
前言
在現(xiàn)代數(shù)字生活中,密碼是保護(hù)個人信息和賬戶安全的第一道防線。隨著網(wǎng)絡(luò)服務(wù)的普及,每個人平均需要管理數(shù)十個不同賬戶的密碼。一個強(qiáng)大且獨(dú)特的密碼通常應(yīng)包含12個以上字符,混合大小寫字母、數(shù)字和特殊符號,并且要避免使用生日、姓名等容易被猜到的信息。這樣的密碼能有效防止黑客通過破解、字典攻擊等手段獲取賬戶權(quán)限,從而避免數(shù)據(jù)泄露和身份盜用等安全風(fēng)險。
然而,記住多個復(fù)雜密碼并不容易。研究表明,約60%的用戶會在不同網(wǎng)站重復(fù)使用相同密碼,這大大增加了安全風(fēng)險。當(dāng)其中一個網(wǎng)站發(fā)生數(shù)據(jù)泄露時,黑客就能利用這些憑證嘗試登錄其他服務(wù)。因此,密碼生成與管理工具應(yīng)運(yùn)而生,它們不僅能自動創(chuàng)建高強(qiáng)度隨機(jī)密碼,還能安全地存儲這些密碼,用戶只需記住一個主密碼即可。
本文將詳細(xì)介紹一個簡單的密碼生成與管理工具的實(shí)現(xiàn)方式。這個工具基于Python編程語言開發(fā),使用標(biāo)準(zhǔn)庫中的secrets模塊來確保密碼生成的隨機(jī)性,并采用AES加密算法保護(hù)存儲的密碼數(shù)據(jù)。我們將逐步解釋其核心功能,包括:
- 密碼生成算法的工作原理
- 加密存儲的實(shí)現(xiàn)機(jī)制
- 用戶界面的設(shè)計(jì)思路
即使你沒有任何編程基礎(chǔ),也能理解它的工作原理。我們將通過類比日常生活中的保險箱來解釋加密過程,用簡單的數(shù)學(xué)概念說明隨機(jī)數(shù)生成原理。最后,我們會提供完整的代碼實(shí)現(xiàn),包括詳細(xì)的注釋和使用說明,供你參考或直接使用。這個工具不僅能幫助個人用戶管理密碼,也可以作為小型團(tuán)隊(duì)的共享密碼管理解決方案。
核心功能
該工具主要包含以下幾個功能:
- 生成隨機(jī)密碼:根據(jù)用戶設(shè)定的長度和字符類型(字母、數(shù)字、符號)生成高強(qiáng)度的隨機(jī)密碼。
- 存儲密碼:將生成的密碼與對應(yīng)的賬戶信息關(guān)聯(lián)存儲,方便后續(xù)查詢。
- 檢索密碼:通過賬戶信息快速找到對應(yīng)的密碼。
- 加密存儲:確保密碼文件的安全性,防止未經(jīng)授權(quán)的訪問。
代碼解析
1. 導(dǎo)入必要的庫
import random import string import json from cryptography.fernet import Fernet import os
random
:用于生成隨機(jī)密碼。string
:提供字母、數(shù)字、符號等字符集合。json
:用于以結(jié)構(gòu)化格式存儲密碼數(shù)據(jù)。cryptography.fernet
:提供加密功能,確保密碼存儲安全。os
:用于檢查文件是否存在。
2. 密碼生成函數(shù)
def generate_password(length=12, use_letters=True, use_numbers=True, use_symbols=True): characters = "" if use_letters: characters += string.ascii_letters if use_numbers: characters += string.digits if use_symbols: characters += string.punctuation if not characters: raise ValueError("至少選擇一種字符類型(字母、數(shù)字或符號)") return ''.join(random.choice(characters) for _ in range(length))
length
:密碼長度,默認(rèn)為12位。use_letters
:是否包含字母(大小寫)。use_numbers
:是否包含數(shù)字。use_symbols
:是否包含符號。- 如果未選擇任何字符類型,會拋出錯誤提示。
3. 加密與解密
def generate_key(): return Fernet.generate_key() def load_key(key_file="secret.key"): if not os.path.exists(key_file): key = generate_key() with open(key_file, "wb") as key_file_obj: key_file_obj.write(key) else: with open(key_file, "rb") as key_file_obj: key = key_file_obj.read() return key def encrypt_data(data, key): fernet = Fernet(key) return fernet.encrypt(data.encode()) def decrypt_data(encrypted_data, key): fernet = Fernet(key) return fernet.decrypt(encrypted_data).decode()
generate_key()
:生成一個加密密鑰。load_key()
:檢查密鑰文件是否存在,若不存在則生成并存儲。encrypt_data()
:加密數(shù)據(jù)。decrypt_data()
:解密數(shù)據(jù)。
4. 密碼存儲與檢索
def save_password(account, password, key, storage_file="passwords.enc"): data = {} if os.path.exists(storage_file): with open(storage_file, "rb") as file: encrypted_data = file.read() decrypted_data = decrypt_data(encrypted_data, key) data = json.loads(decrypted_data) data[account] = password encrypted_data = encrypt_data(json.dumps(data), key) with open(storage_file, "wb") as file: file.write(encrypted_data) def get_password(account, key, storage_file="passwords.enc"): if not os.path.exists(storage_file): return None with open(storage_file, "rb") as file: encrypted_data = file.read() decrypted_data = decrypt_data(encrypted_data, key) data = json.loads(decrypted_data) return data.get(account, None)
save_password()
:將賬戶和密碼加密存儲到文件。get_password()
:從加密文件中檢索特定賬戶的密碼。
5. 主程序邏輯
def main(): key = load_key() print("密碼生成與管理工具") while True: print("\n選項(xiàng):") print("1. 生成新密碼") print("2. 存儲密碼") print("3. 檢索密碼") print("4. 退出") choice = input("請選擇操作 (1/2/3/4): ") if choice == "1": length = int(input("輸入密碼長度: ")) use_letters = input("包含字母? (y/n): ").lower() == "y" use_numbers = input("包含數(shù)字? (y/n): ").lower() == "y" use_symbols = input("包含符號? (y/n): ").lower() == "y" password = generate_password(length, use_letters, use_numbers, use_symbols) print(f"生成的密碼: {password}") elif choice == "2": account = input("輸入賬戶名稱: ") password = input("輸入密碼(留空生成隨機(jī)密碼): ") if not password: length = int(input("輸入密碼長度: ")) use_letters = input("包含字母? (y/n): ").lower() == "y" use_numbers = input("包含數(shù)字? (y/n): ").lower() == "y" use_symbols = input("包含符號? (y/n): ").lower() == "y" password = generate_password(length, use_letters, use_numbers, use_symbols) print(f"生成的密碼: {password}") save_password(account, password, key) print("密碼已存儲!") elif choice == "3": account = input("輸入賬戶名稱: ") password = get_password(account, key) if password: print(f"賬戶 {account} 的密碼: {password}") else: print("未找到該賬戶的密碼。") elif choice == "4": print("退出程序。") break else: print("無效選項(xiàng),請重試。") if __name__ == "__main__": main()
提供交互式菜單,支持生成、存儲和檢索密碼。
用戶可以選擇手動輸入密碼或自動生成。
完整源碼
import random import string import json from cryptography.fernet import Fernet import os def generate_password(length=12, use_letters=True, use_numbers=True, use_symbols=True): characters = "" if use_letters: characters += string.ascii_letters if use_numbers: characters += string.digits if use_symbols: characters += string.punctuation if not characters: raise ValueError("至少選擇一種字符類型(字母、數(shù)字或符號)") return ''.join(random.choice(characters) for _ in range(length)) def generate_key(): return Fernet.generate_key() def load_key(key_file="secret.key"): if not os.path.exists(key_file): key = generate_key() with open(key_file, "wb") as key_file_obj: key_file_obj.write(key) else: with open(key_file, "rb") as key_file_obj: key = key_file_obj.read() return key def encrypt_data(data, key): fernet = Fernet(key) return fernet.encrypt(data.encode()) def decrypt_data(encrypted_data, key): fernet = Fernet(key) return fernet.decrypt(encrypted_data).decode() def save_password(account, password, key, storage_file="passwords.enc"): data = {} if os.path.exists(storage_file): with open(storage_file, "rb") as file: encrypted_data = file.read() decrypted_data = decrypt_data(encrypted_data, key) data = json.loads(decrypted_data) data[account] = password encrypted_data = encrypt_data(json.dumps(data), key) with open(storage_file, "wb") as file: file.write(encrypted_data) def get_password(account, key, storage_file="passwords.enc"): if not os.path.exists(storage_file): return None with open(storage_file, "rb") as file: encrypted_data = file.read() decrypted_data = decrypt_data(encrypted_data, key) data = json.loads(decrypted_data) return data.get(account, None) def main(): key = load_key() print("密碼生成與管理工具") while True: print("\n選項(xiàng):") print("1. 生成新密碼") print("2. 存儲密碼") print("3. 檢索密碼") print("4. 退出") choice = input("請選擇操作 (1/2/3/4): ") if choice == "1": length = int(input("輸入密碼長度: ")) use_letters = input("包含字母? (y/n): ").lower() == "y" use_numbers = input("包含數(shù)字? (y/n): ").lower() == "y" use_symbols = input("包含符號? (y/n): ").lower() == "y" password = generate_password(length, use_letters, use_numbers, use_symbols) print(f"生成的密碼: {password}") elif choice == "2": account = input("輸入賬戶名稱: ") password = input("輸入密碼(留空生成隨機(jī)密碼): ") if not password: length = int(input("輸入密碼長度: ")) use_letters = input("包含字母? (y/n): ").lower() == "y" use_numbers = input("包含數(shù)字? (y/n): ").lower() == "y" use_symbols = input("包含符號? (y/n): ").lower() == "y" password = generate_password(length, use_letters, use_numbers, use_symbols) print(f"生成的密碼: {password}") save_password(account, password, key) print("密碼已存儲!") elif choice == "3": account = input("輸入賬戶名稱: ") password = get_password(account, key) if password: print(f"賬戶 {account} 的密碼: {password}") else: print("未找到該賬戶的密碼。") elif choice == "4": print("退出程序。") break else: print("無效選項(xiàng),請重試。") if __name__ == "__main__": main()
總結(jié)
該密碼生成與管理工具提供了基本的安全功能,包括隨機(jī)密碼生成、加密存儲和檢索。雖然這是一個簡單的實(shí)現(xiàn),但足以應(yīng)對個人使用場景。
如果你想進(jìn)一步改進(jìn),可以考慮:
- 增加密碼強(qiáng)度檢查功能。
- 支持多用戶管理。
- 提供圖形界面(GUI)版本。
到此這篇關(guān)于基于Python實(shí)現(xiàn)密碼生成與管理工具(進(jìn)階版)的文章就介紹到這了,更多相關(guān)Python密碼生成與管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ORM Django 終端打印 SQL 語句實(shí)現(xiàn)解析
這篇文章主要介紹了ORM Django 終端打印 SQL 語句實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08Python通過paramiko遠(yuǎn)程下載Linux服務(wù)器上的文件實(shí)例
今天小編就為大家分享一篇Python通過paramiko遠(yuǎn)程下載Linux服務(wù)器上的文件實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12基于Python實(shí)現(xiàn)經(jīng)典植物大戰(zhàn)僵尸游戲
這篇文章主要介紹了如何利用Python實(shí)現(xiàn)植物大戰(zhàn)僵尸游戲,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2022-05-05深度學(xué)習(xí)Tensorflow2.8實(shí)現(xiàn)GRU文本生成任務(wù)詳解
這篇文章主要為大家介紹了深度學(xué)習(xí)Tensorflow?2.8?實(shí)現(xiàn)?GRU?文本生成任務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Django模板報TemplateDoesNotExist異常(親測可行)
這篇文章主要介紹了Django模板報TemplateDoesNotExist異常(親測可行),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12python求numpy中array按列非零元素的平均值案例
這篇文章主要介紹了python求numpy中array按列非零元素的平均值案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python協(xié)程的2種實(shí)現(xiàn)方式分享
在?Python?中,協(xié)程(Coroutine)是一種輕量級的并發(fā)編程方式,可以通過協(xié)作式多任務(wù)來實(shí)現(xiàn)高效的并發(fā)執(zhí)行。本文主要介紹了Python實(shí)現(xiàn)協(xié)程的2種方式,希望對大家有所幫助2023-04-04使用python快速在局域網(wǎng)內(nèi)搭建http傳輸文件服務(wù)的方法
這篇文章主要介紹了使用 python快速在局域網(wǎng)內(nèi)搭建http傳輸文件服務(wù),但是這種方法不要傳輸機(jī)密文件,安全性不高,只用到http協(xié)議沒有使用任何加密協(xié)議,具體實(shí)現(xiàn)方法跟隨小編一起看看吧2019-11-11