You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中用txt文件为多个程序存储专属密码?

解决方案:适配多文件专属密码的修改方案

核心思路

  1. 修改存储格式:将原纯文本的password.txt改为JSON格式,存储脚本文件名: 密码哈希值的键值对,实现多密码的结构化管理。
  2. 动态识别脚本:通过__file__或sys.argv[0]获取当前调用脚本的文件名(而非__name__,因为__name__在脚本直接运行时恒为__main__,无法区分不同脚本),作为密码的唯一标识。
  3. 更新函数逻辑:调整密码的保存、验证、修改函数,使其针对指定脚本的密码进行操作。

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:43:09