基于Python实现密码生成与管理工具(进阶版)

 更新时间:2025年08月05日 10:20:57   作者:超级小识  
在现代数字生活中,密码是保护个人信息和账户安全的第一道防线,本文将详细介绍一个简单的密码生成与管理工具的实现方式,希望对大家有所帮助

前言

在现代数字生活中,密码是保护个人信息和账户安全的第一道防线。随着网络服务的普及,每个人平均需要管理数十个不同账户的密码。一个强大且独特的密码通常应包含12个以上字符,混合大小写字母、数字和特殊符号,并且要避免使用生日、姓名等容易被猜到的信息。这样的密码能有效防止黑客通过破解、字典攻击等手段获取账户权限,从而避免数据泄露和身份盗用等安全风险。

然而,记住多个复杂密码并不容易。研究表明,约60%的用户会在不同网站重复使用相同密码,这大大增加了安全风险。当其中一个网站发生数据泄露时,黑客就能利用这些凭证尝试登录其他服务。因此,密码生成与管理工具应运而生,它们不仅能自动创建高强度随机密码,还能安全地存储这些密码,用户只需记住一个主密码即可。

本文将详细介绍一个简单的密码生成与管理工具的实现方式。这个工具基于Python编程语言开发,使用标准库中的secrets模块来确保密码生成的随机性,并采用AES加密算法保护存储的密码数据。我们将逐步解释其核心功能,包括:

  • 密码生成算法的工作原理
  • 加密存储的实现机制
  • 用户界面的设计思路

即使你没有任何编程基础,也能理解它的工作原理。我们将通过类比日常生活中的保险箱来解释加密过程,用简单的数学概念说明随机数生成原理。最后,我们会提供完整的代码实现,包括详细的注释和使用说明,供你参考或直接使用。这个工具不仅能帮助个人用户管理密码,也可以作为小型团队的共享密码管理解决方案。

核心功能

该工具主要包含以下几个功能:

  • 生成随机密码:根据用户设定的长度和字符类型(字母、数字、符号)生成高强度的随机密码。
  • 存储密码:将生成的密码与对应的账户信息关联存储,方便后续查询。
  • 检索密码:通过账户信息快速找到对应的密码。
  • 加密存储:确保密码文件的安全性,防止未经授权的访问。

代码解析

1. 导入必要的库

import random
import string
import json
from cryptography.fernet import Fernet
import os
  • random:用于生成随机密码。
  • string:提供字母、数字、符号等字符集合。
  • json:用于以结构化格式存储密码数据。
  • cryptography.fernet:提供加密功能,确保密码存储安全。
  • os:用于检查文件是否存在。

2. 密码生成函数

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("至少选择一种字符类型(字母、数字或符号)")
    
    return ''.join(random.choice(characters) for _ in range(length))
  • length:密码长度,默认为12位。
  • use_letters:是否包含字母(大小写)。
  • use_numbers:是否包含数字。
  • 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():加密数据。
  • decrypt_data():解密数据。

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("包含数字? (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("包含数字? (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("至少选择一种字符类型(字母、数字或符号)")
    
    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("包含数字? (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("包含数字? (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()

总结

该密码生成与管理工具提供了基本的安全功能,包括随机密码生成、加密存储和检索。虽然这是一个简单的实现,但足以应对个人使用场景。

如果你想进一步改进,可以考虑:

  • 增加密码强度检查功能。
  • 支持多用户管理。
  • 提供图形界面(GUI)版本。

到此这篇关于基于Python实现密码生成与管理工具(进阶版)的文章就介绍到这了,更多相关Python密码生成与管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用python爬取4K壁纸保存到本地文件夹的全过程

    使用python爬取4K壁纸保存到本地文件夹的全过程

    图片信息丰富多彩,许多网站上都有大量精美的图片资源,有时候我们可能需要批量下载这些图片,而手动一个个下载显然效率太低,所以本文给大家介绍了使用python爬取4K壁纸保存到本地文件夹的全过程,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-03-03
  • ORM Django 终端打印 SQL 语句实现解析

    ORM Django 终端打印 SQL 语句实现解析

    这篇文章主要介绍了ORM Django 终端打印 SQL 语句实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python通过paramiko远程下载Linux服务器上的文件实例

    Python通过paramiko远程下载Linux服务器上的文件实例

    今天小编就为大家分享一篇Python通过paramiko远程下载Linux服务器上的文件实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • 基于Python实现经典植物大战僵尸游戏

    基于Python实现经典植物大战僵尸游戏

    这篇文章主要介绍了如何利用Python实现植物大战僵尸游戏,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2022-05-05
  • 深度学习Tensorflow2.8实现GRU文本生成任务详解

    深度学习Tensorflow2.8实现GRU文本生成任务详解

    这篇文章主要为大家介绍了深度学习Tensorflow 2.8 实现 GRU 文本生成任务示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Django模板报TemplateDoesNotExist异常(亲测可行)

    Django模板报TemplateDoesNotExist异常(亲测可行)

    这篇文章主要介绍了Django模板报TemplateDoesNotExist异常(亲测可行),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • python求numpy中array按列非零元素的平均值案例

    python求numpy中array按列非零元素的平均值案例

    这篇文章主要介绍了python求numpy中array按列非零元素的平均值案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python协程的2种实现方式分享

    Python协程的2种实现方式分享

    在 Python 中,协程(Coroutine)是一种轻量级的并发编程方式,可以通过协作式多任务来实现高效的并发执行。本文主要介绍了Python实现协程的2种方式,希望对大家有所帮助
    2023-04-04
  • 使用python快速在局域网内搭建http传输文件服务的方法

    使用python快速在局域网内搭建http传输文件服务的方法

    这篇文章主要介绍了使用 python快速在局域网内搭建http传输文件服务,但是这种方法不要传输机密文件,安全性不高,只用到http协议没有使用任何加密协议,具体实现方法跟随小编一起看看吧
    2019-11-11
  • Python 开发Activex组件方法

    Python 开发Activex组件方法

    Python强的功能就在于它无所不能。
    2009-11-11

最新评论