进阶向:密码生成与管理工具

密码生成与管理工具:从零开始的完全指南

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

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

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

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

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


密码生成与管理工具的核心功能

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

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

代码解析

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_lettersif use_numbers:characters += string.digitsif use_symbols:characters += string.punctuationif 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 keydef 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] = passwordencrypted_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 Nonewith 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("退出程序。")breakelse:print("无效选项,请重试。")if __name__ == "__main__":main()

  • 提供交互式菜单,支持生成、存储和检索密码。
  • 用户可以选择手动输入密码或自动生成。

完整源码

import random
import string
import json
from cryptography.fernet import Fernet
import osdef generate_password(length=12, use_letters=True, use_numbers=True, use_symbols=True):characters = ""if use_letters:characters += string.ascii_lettersif use_numbers:characters += string.digitsif use_symbols:characters += string.punctuationif 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 keydef 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] = passwordencrypted_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 Nonewith 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("退出程序。")breakelse:print("无效选项,请重试。")if __name__ == "__main__":main()


总结

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

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

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

希望这篇指南对你有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921406.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 Gitee 中 git push 因邮箱隐私设置导致的失败问题

解决 Gitee 中 git push 因邮箱隐私设置导致的失败问题 在使用 Git 向 Gitee 远程仓库推送代码时,可能会遇到因邮箱隐私设置引发的 git push 失败情况。最近我就碰到了,现在把问题现象、原因和解决方法分享出来。 一、错误现象 执行 git push -u origin …

Flutter的三棵树

“三棵树”是 Flutter 渲染和构建UI的核心机制,理解它们对于掌握 Flutter 至关重要。这三棵树分别是: Widget 树 Element 树 RenderObject 树 它们协同工作,以实现 Flutter 的高性能渲染和高效的响应式编程模型。 Flutter 是声明式的UI&…

同一台nginx中配置多个前端项目的三种方式

目录 第一种方式:配置多个二级域名 第二种方式:配置端口转发(不推荐) 第三种方式:同一个server中基于location配置(重点讲解) 第一种方式:配置多个二级域名 一个域名下面申请多个二级域名,每个二级域名配置一个vue前端项目,这个很好配置,在这里不再详细说明。 …

第二家公司虽然用PowerBI ,可能更适合用以前的QuickBI

第二家公司虽然用PowerBI ,可能更适合用以前的QuickBI现在回想一下,第二家公司数据源是MySQL ,常规报表是用excel报表,另外还做了一张能发布到web的看板供运营使用。基于基本情况,quickbi 的早期版本是合适的&#xff…

STM32 USBx Device HID standalone 移植示例 LAT1466

关键字:USBx, Device, HID,standalone 1.设计目的 目前 USBx Device standalone 的官方示例较少,不过使用 STM32CubeMX 可以快速地生成 USBx Device 相关类的示例工程,会很方便大家的开发。这里以 NUCLEO-H563 为例&…

python创建并写入excel文件

大家好,这里是七七,今天来跟大家分享一个python创建并写入一个excel文件的小例子,话不多说,开始介绍。首先我们来看一下这一小段代码。import openpyxl# 创建一个新的 Excel 工作簿workbook openpyxl.Workbook()# 获取当前活动的…

react native 出现 FATAL EXCEPTION: OkHttp Dispatcher

react native 出现 FATAL EXCEPTION: OkHttp Dispatcher 报错信息FATAL EXCEPTION: OkHttp DispatcherProcess: , PID: 8868java.lang.NoSuchMethodError: No virtual method toString(Z)Ljava/lang/String; in class Lokhttp3/Cookie; or its super classes (declaration of o…

sentinel实现控制台与nacos数据双向绑定

有两种方式可以实现&#xff1a;Springboot客户端做相应配置&#xff08;推荐&#xff09;修改sentinel-dashboard的源码一、Springboot客户端做相应配置&#xff08;推荐&#xff09;1、添加依赖<dependency><groupId>com.alibaba.csp</groupId><artifac…

Kubernetes (k8s)

Kubernetes (k8s) 以下是一份 ​Kubernetes (k8s) 基础使用教程&#xff0c;涵盖从环境搭建到核心操作的完整流程&#xff0c;附详细命令和示例&#xff1a; &#x1f680; ​一、环境准备&#xff08;3种方式&#xff09;​​ ​1. 本地开发环境&#xff08;推荐&#xff09;​…

三打ANSYS HFSS

2. 激励方式&#xff08;端口&#xff09;详细对比分析在HFSS中&#xff0c;“激励方式”和“端口”这两个词经常混用&#xff0c;但严格来说&#xff0c;“端口”是实现“激励”的一种最主要的方式。端口类型工作原理适用情况优点缺点波端口 (Wave Port)默认首选。计算端口的固…

3.python——数据类型转换

python的数据类型转换分为两种&#xff1a; 隐式转换&#xff1a;自动完成 显式转换&#xff1a;用类型函数转换 隐式转换 # 自动转为浮点数 num_int 123 num_flo 1.23num_new num_int num_flo显式转换 整型 x int(1) # x 输出结果为 1 y int(2.8) # y 输出结果为 2 z …

迅为RK3568开发板OpenHarmonyv3.2-Beta4版本测试-命令终端

将串口连接到开发板的调试串口&#xff0c;进入 OpenHarmony 系统后&#xff0c;会自动进入 OpenHarmony终端&#xff0c;如下图所示&#xff1a;

【面试题】介绍一下BERT和GPT的训练方式区别?

BERT(双向编码器): 预训练任务: 掩码语言模型(MLM):随机掩盖15%的token,其中: 80%替换为[MASK] 10%替换为随机token 10%保持原样 下一句预测(NSP):判断两个句子是否连续(后续版本已移除) 训练特点: 使用双向Transformer编码器 同时利用左右上下文信息 适合理解类任…

邪修实战系列(1)

1、第一阶段邪修实战总览&#xff08;9.1-9.30&#xff09; 把第一阶段&#xff08;基础夯实期&#xff09;的学习计划拆解成极具操作性的每日行动方案。这个计划充分利用我“在职学习”的特殊优势&#xff0c;强调“用输出倒逼输入”&#xff0c;确保每一分钟的学习都直接服务…

XR数字融合工作站打造智能制造专业学习新范式

智能制造是工业4.0的核心发展方向&#xff0c;涵盖数字化设计、智能生产、工业机器人、数字孪生、物联网等关键技术。然而&#xff0c;传统教学模式在设备成本高、实训风险大、抽象概念难理解等方面存在诸多挑战。XR数字融合工作站,利用VR/AR/MR等技术&#xff0c;通过虚拟仿真…

基于FPGA实现数字QAM调制系统

基于FPGA实现数字QAM调制系统题目要求一、代码设计1.顶层2.分频3.m序列4.串转并5.映射6.正弦波余弦波生成ROM和7.ask二、仿真波形总结题目要求 FPGA实现数字QAM调制系统要求根据正交振幅调制原理&#xff0c;利用正弦载波信号发生器&#xff0c;实现调制信号。调制原理会利用到…

DAY 22 复习日

浙大疏锦行复习日 仔细回顾一下之前21天的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 导入需要的库 import pandas as pd # 用于数据处理和分析&#xff0c;…

biocmanager安装 库 老是提示网络连接错误 才尝试各种办法

您好&#xff0c;遇到 BioManager &#xff08;通常是 BiocManager&#xff09;安装R包时提示网络连接错误确实非常令人头疼。这通常与R/RStudio的配置、网络环境&#xff08;尤其是国内用户&#xff09;或SSL证书问题有关。 请不要着急&#xff0c;我们可以按照从易到难的顺序…

【开题答辩全过程】以 智能商品数据分析系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

解构复杂财务逆向业务:如何优雅地生成与管理负数单?

文章目录一 核心复杂性二 关键设计模式&#xff1a;三 棘手场景与解决方案&#xff1a;1.分批合并处理&#xff1a;负数单需能智能拆分&#xff0c;精准冲销多批次的正向单据。2.优先级问题&#xff1a;3.超额处理&#xff1a;系统应坚决拦截而非处理&#xff0c;防止资金损失和…