基于Python實現(xiàn)密碼生成與管理工具(進階版)
前言
在現(xiàn)代數(shù)字生活中,密碼是保護個人信息和賬戶安全的第一道防線。隨著網(wǎng)絡(luò)服務(wù)的普及,每個人平均需要管理數(shù)十個不同賬戶的密碼。一個強大且獨特的密碼通常應(yīng)包含12個以上字符,混合大小寫字母、數(shù)字和特殊符號,并且要避免使用生日、姓名等容易被猜到的信息。這樣的密碼能有效防止黑客通過破解、字典攻擊等手段獲取賬戶權(quán)限,從而避免數(shù)據(jù)泄露和身份盜用等安全風險。
然而,記住多個復(fù)雜密碼并不容易。研究表明,約60%的用戶會在不同網(wǎng)站重復(fù)使用相同密碼,這大大增加了安全風險。當其中一個網(wǎng)站發(fā)生數(shù)據(jù)泄露時,黑客就能利用這些憑證嘗試登錄其他服務(wù)。因此,密碼生成與管理工具應(yīng)運而生,它們不僅能自動創(chuàng)建高強度隨機密碼,還能安全地存儲這些密碼,用戶只需記住一個主密碼即可。
本文將詳細介紹一個簡單的密碼生成與管理工具的實現(xiàn)方式。這個工具基于Python編程語言開發(fā),使用標準庫中的secrets模塊來確保密碼生成的隨機性,并采用AES加密算法保護存儲的密碼數(shù)據(jù)。我們將逐步解釋其核心功能,包括:
- 密碼生成算法的工作原理
- 加密存儲的實現(xiàn)機制
- 用戶界面的設(shè)計思路
即使你沒有任何編程基礎(chǔ),也能理解它的工作原理。我們將通過類比日常生活中的保險箱來解釋加密過程,用簡單的數(shù)學概念說明隨機數(shù)生成原理。最后,我們會提供完整的代碼實現(xiàn),包括詳細的注釋和使用說明,供你參考或直接使用。這個工具不僅能幫助個人用戶管理密碼,也可以作為小型團隊的共享密碼管理解決方案。
核心功能
該工具主要包含以下幾個功能:
- 生成隨機密碼:根據(jù)用戶設(shè)定的長度和字符類型(字母、數(shù)字、符號)生成高強度的隨機密碼。
- 存儲密碼:將生成的密碼與對應(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:用于生成隨機密碼。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:密碼長度,默認為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選項:")
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("輸入密碼(留空生成隨機密碼): ")
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("無效選項,請重試。")
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選項:")
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("輸入密碼(留空生成隨機密碼): ")
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("無效選項,請重試。")
if __name__ == "__main__":
main()
總結(jié)
該密碼生成與管理工具提供了基本的安全功能,包括隨機密碼生成、加密存儲和檢索。雖然這是一個簡單的實現(xiàn),但足以應(yīng)對個人使用場景。
如果你想進一步改進,可以考慮:
- 增加密碼強度檢查功能。
- 支持多用戶管理。
- 提供圖形界面(GUI)版本。
到此這篇關(guān)于基于Python實現(xiàn)密碼生成與管理工具(進階版)的文章就介紹到這了,更多相關(guān)Python密碼生成與管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ORM Django 終端打印 SQL 語句實現(xiàn)解析
這篇文章主要介紹了ORM Django 終端打印 SQL 語句實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08
Python通過paramiko遠程下載Linux服務(wù)器上的文件實例
今天小編就為大家分享一篇Python通過paramiko遠程下載Linux服務(wù)器上的文件實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
基于Python實現(xiàn)經(jīng)典植物大戰(zhàn)僵尸游戲
這篇文章主要介紹了如何利用Python實現(xiàn)植物大戰(zhàn)僵尸游戲,文中有非常詳細的代碼示例,對正在學習python的小伙伴們有非常好的幫助,需要的朋友可以參考下2022-05-05
深度學習Tensorflow2.8實現(xiàn)GRU文本生成任務(wù)詳解
這篇文章主要為大家介紹了深度學習Tensorflow?2.8?實現(xiàn)?GRU?文本生成任務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
Django模板報TemplateDoesNotExist異常(親測可行)
這篇文章主要介紹了Django模板報TemplateDoesNotExist異常(親測可行),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
python求numpy中array按列非零元素的平均值案例
這篇文章主要介紹了python求numpy中array按列非零元素的平均值案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
使用python快速在局域網(wǎng)內(nèi)搭建http傳輸文件服務(wù)的方法
這篇文章主要介紹了使用 python快速在局域網(wǎng)內(nèi)搭建http傳輸文件服務(wù),但是這種方法不要傳輸機密文件,安全性不高,只用到http協(xié)議沒有使用任何加密協(xié)議,具體實現(xiàn)方法跟隨小編一起看看吧2019-11-11

