如何在Python中用txt文件为多个程序存储专属密码?
解决方案:适配多文件专属密码的修改方案
核心思路
- 修改存储格式:将原纯文本的
password.txt改为JSON格式,存储脚本文件名: 密码哈希值的键值对,实现多密码的结构化管理。 - 动态识别脚本:通过
__file__或sys.argv[0]获取当前调用脚本的文件名(而非__name__,因为__name__在脚本直接运行时恒为__main__,无法区分不同脚本),作为密码的唯一标识。 - 更新函数逻辑:调整密码的保存、验证、修改函数,使其针对指定脚本的密码进行操作。
修改后的完整代码
import tkinter as tk import hashlib import sys import os import json from tkinter import simpledialog, messagebox FILE_PASSWORD = "password.txt" def hash_password(password): return hashlib.sha256(password.encode()).hexdigest() def save_password(password, script_name): # 读取现有密码数据,若文件不存在或格式错误则初始化空字典 if os.path.exists(FILE_PASSWORD): with open(FILE_PASSWORD, "r") as file: try: password_data = json.load(file) except json.JSONDecodeError: password_data = {} else: password_data = {} # 更新对应脚本的密码哈希 password_data[script_name] = hash_password(password) # 写入JSON文件,格式化输出便于查看 with open(FILE_PASSWORD, "w") as file: json.dump(password_data, file, indent=2) def check_password(script_name): if not os.path.exists(FILE_PASSWORD): return None with open(FILE_PASSWORD, "r") as file: try: password_data = json.load(file) return password_data.get(script_name) except json.JSONDecodeError: return None def ask_password(): # 获取当前运行脚本的文件名 script_name = os.path.basename(sys.argv[0]) if sys.argv[0] else os.path.basename(__file__) stored_hash = check_password(script_name) if stored_hash is None: # 脚本无密码,引导创建 new_password = simpledialog.askstring("设置密码", f"为{script_name}创建新密码:", show='*') if new_password: save_password(new_password, script_name) messagebox.showinfo("成功", "密码已保存!") else: messagebox.showerror("错误", "无效的密码!") sys.exit() else: # 验证现有密码 user_input = simpledialog.askstring("验证密码", f"请输入{script_name}的密码:", show='*') if user_input and hash_password(user_input) == stored_hash: messagebox.showinfo("成功", "密码验证通过!") else: messagebox.showerror("错误", "密码错误!") sys.exit() def change_password(): script_name = os.path.basename(sys.argv[0]) if sys.argv[0] else os.path.basename(__file__) stored_hash = check_password(script_name) if stored_hash is None: messagebox.showerror("错误", f"{script_name}尚未设置密码,请先创建密码!") return # 先验证旧密码 old_password = simpledialog.askstring("验证旧密码", "请输入旧密码:", show='*') if not old_password or hash_password(old_password) != stored_hash: messagebox.showerror("错误", "旧密码错误!") return # 设置新密码 new_password = simpledialog.askstring("修改密码", "请输入新密码:", show='*') if new_password: save_password(new_password, script_name) messagebox.showinfo("成功", "密码已修改!") else: messagebox.showerror("错误", "无效的新密码!") # 示例调用(如果该模块直接运行时) if __name__ == "__main__": root = tk.Tk() root.withdraw() # 隐藏主窗口 ask_password()
关键说明
- 为什么不用
__name__:当脚本直接运行时,__name__的值恒为__main__,无法区分不同的脚本(比如file1.py和file2.py直接运行时__name__都是__main__),而os.path.basename(__file__)或sys.argv[0]能准确获取脚本的文件名(如file1.py),作为密码的唯一标识。 - JSON格式优势:结构化存储多组键值对,便于读取和修改单个脚本的密码,同时保证数据的可读性。
- 密码验证逻辑:新增了密码验证步骤,确保只有输入正确密码的用户才能继续操作,完善了原代码的安全逻辑。
内容的提问来源于stack exchange,提问作者oivil
相关产品推荐
相关产品推荐

