From d0eb17acf33f5fc28ad295cb151817225fdac902 Mon Sep 17 00:00:00 2001
From: hyb <kk_huangyangbo@163.com>
Date: Wed, 14 May 2025 09:34:49 +0000
Subject: [PATCH] 增加密码查询工具 增加造数脚本和模版
---
测试组/脚本/密码查询工具/mimatubiao.png | 0
测试组/脚本/密码查询工具/setup.py | 22 ++
测试组/脚本/密码查询工具/密码查询工具.spec | 38 ++++
测试组/脚本/密码查询工具/.idea/密码查询工具.iml | 10 +
测试组/脚本/密码查询工具/main.spec | 38 ++++
测试组/脚本/密码查询工具/username_history.json | 1
测试组/脚本/密码查询工具/.idea/modules.xml | 8 +
测试组/脚本/密码查询工具/密码查询工具V2.0.py | 256 ++++++++++++++++++++++++++++++++
测试组/脚本/造数脚本 | 1
测试组/脚本/密码查询工具/database_info.json | 32 ++++
测试组/脚本/密码查询工具/.idea/misc.xml | 7
测试组/脚本/密码查询工具/.idea/inspectionProfiles/profiles_settings.xml | 6
测试组/脚本/密码查询工具/.idea/.gitignore | 8 +
13 files changed, 427 insertions(+), 0 deletions(-)
diff --git "a/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/.idea/.gitignore" "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/.idea/.gitignore"
new file mode 100644
index 0000000..35410ca
--- /dev/null
+++ "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/.idea/.gitignore"
@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git "a/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/.idea/inspectionProfiles/profiles_settings.xml" "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/.idea/inspectionProfiles/profiles_settings.xml"
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/.idea/inspectionProfiles/profiles_settings.xml"
@@ -0,0 +1,6 @@
+<component name="InspectionProjectProfileManager">
+ <settings>
+ <option name="USE_PROJECT_PROFILE" value="false" />
+ <version value="1.0" />
+ </settings>
+</component>
\ No newline at end of file
diff --git "a/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/.idea/misc.xml" "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/.idea/misc.xml"
new file mode 100644
index 0000000..8f227ab
--- /dev/null
+++ "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/.idea/misc.xml"
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="Black">
+ <option name="sdkName" value="Python 3.12 (密码查询工具)" />
+ </component>
+ <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (密码查询工具)" project-jdk-type="Python SDK" />
+</project>
\ No newline at end of file
diff --git "a/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/.idea/modules.xml" "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/.idea/modules.xml"
new file mode 100644
index 0000000..156d722
--- /dev/null
+++ "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/.idea/modules.xml"
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectModuleManager">
+ <modules>
+ <module fileurl="file://$PROJECT_DIR$/.idea/密码查询工具.iml" filepath="$PROJECT_DIR$/.idea/密码查询工具.iml" />
+ </modules>
+ </component>
+</project>
\ No newline at end of file
diff --git "a/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/.idea/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267.iml" "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/.idea/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267.iml"
new file mode 100644
index 0000000..2c80e12
--- /dev/null
+++ "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/.idea/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267.iml"
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+ <component name="NewModuleRootManager">
+ <content url="file://$MODULE_DIR$">
+ <excludeFolder url="file://$MODULE_DIR$/.venv" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
+</module>
\ No newline at end of file
diff --git "a/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/database_info.json" "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/database_info.json"
new file mode 100644
index 0000000..b587a78
--- /dev/null
+++ "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/database_info.json"
@@ -0,0 +1,32 @@
+{
+ "\u798f\u5efa\u4e2d\u533b\u836f": {
+ "host": "rm-wz92t61c360x07976wo.mysql.rds.aliyuncs.com",
+ "port": "3306",
+ "user": "dev",
+ "password": "Hello@112",
+ "db_name": "srps_fjtcm_uat",
+ "table_name": "sys_user",
+ "username_col": "login_name",
+ "password_col": "plain_text"
+ },
+ "\u5e7f\u5dde\u751f\u7269": {
+ "host": "rm-wz97y18i4t16hfsk6qo.mysql.rds.aliyuncs.com",
+ "port": "3306",
+ "user": "dev",
+ "password": "Hello@112",
+ "db_name": "srps_gibh",
+ "table_name": "sys_user",
+ "username_col": "login_name",
+ "password_col": "plain_text"
+ },
+ "\u6e05\u534e\u5927\u5b66": {
+ "host": "rm-wz97y18i4t16hfsk6qo.mysql.rds.aliyuncs.com",
+ "port": "3306",
+ "user": "dev",
+ "password": "Hello@112",
+ "db_name": "srps3",
+ "table_name": "sys_user",
+ "username_col": "login_name",
+ "password_col": "plain_text"
+ }
+}
\ No newline at end of file
diff --git "a/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/main.spec" "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/main.spec"
new file mode 100644
index 0000000..c55496f
--- /dev/null
+++ "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/main.spec"
@@ -0,0 +1,38 @@
+# -*- mode: python ; coding: utf-8 -*-
+
+
+a = Analysis(
+ ['main.py'],
+ pathex=[],
+ binaries=[],
+ datas=[],
+ hiddenimports=[],
+ hookspath=[],
+ hooksconfig={},
+ runtime_hooks=[],
+ excludes=[],
+ noarchive=False,
+ optimize=0,
+)
+pyz = PYZ(a.pure)
+
+exe = EXE(
+ pyz,
+ a.scripts,
+ a.binaries,
+ a.datas,
+ [],
+ name='main',
+ debug=False,
+ bootloader_ignore_signals=False,
+ strip=False,
+ upx=True,
+ upx_exclude=[],
+ runtime_tmpdir=None,
+ console=False,
+ disable_windowed_traceback=False,
+ argv_emulation=False,
+ target_arch=None,
+ codesign_identity=None,
+ entitlements_file=None,
+)
diff --git "a/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/mimatubiao.png" "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/mimatubiao.png"
new file mode 100644
index 0000000..f8bb2cb
--- /dev/null
+++ "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/mimatubiao.png"
Binary files differ
diff --git "a/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/setup.py" "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/setup.py"
new file mode 100644
index 0000000..5f2bd9d
--- /dev/null
+++ "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/setup.py"
@@ -0,0 +1,22 @@
+from setuptools import setup
+
+APP = ['密码查询工具.py'] # 替换为你的Python脚本名
+DATA_FILES = ['database_info.json'] # 如果你有其他的静态资源文件,添加到这里
+OPTIONS = {
+ 'argv_emulation': True,
+ 'packages': ['tkinter', 'mysql.connector'], # 你使用的额外Python包
+ 'iconfile': 'mimatubiao.png', # 如果你有自定义图标,替换为图标文件路径
+ 'plist': {
+ 'CFBundleName': 'Password Query Tool',
+ 'CFBundleShortVersionString': '0.1',
+ 'CFBundleVersion': '0.1',
+ 'CFBundleIdentifier': 'com.yourcompany.passwordquerytool'
+ }
+}
+
+setup(
+ app=APP,
+ data_files=DATA_FILES,
+ options={'py2app': OPTIONS},
+ setup_requires=['py2app'],
+)
diff --git "a/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/username_history.json" "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/username_history.json"
new file mode 100644
index 0000000..1dd62b8
--- /dev/null
+++ "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/username_history.json"
@@ -0,0 +1 @@
+["gly"]
\ No newline at end of file
diff --git "a/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267.spec" "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267.spec"
new file mode 100644
index 0000000..10538d1
--- /dev/null
+++ "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267.spec"
@@ -0,0 +1,38 @@
+# -*- mode: python ; coding: utf-8 -*-
+
+
+a = Analysis(
+ ['密码查询工具.py'],
+ pathex=[],
+ binaries=[],
+ datas=[],
+ hiddenimports=[],
+ hookspath=[],
+ hooksconfig={},
+ runtime_hooks=[],
+ excludes=[],
+ noarchive=False,
+ optimize=0,
+)
+pyz = PYZ(a.pure)
+
+exe = EXE(
+ pyz,
+ a.scripts,
+ a.binaries,
+ a.datas,
+ [],
+ name='密码查询工具',
+ debug=False,
+ bootloader_ignore_signals=False,
+ strip=False,
+ upx=True,
+ upx_exclude=[],
+ runtime_tmpdir=None,
+ console=False,
+ disable_windowed_traceback=False,
+ argv_emulation=False,
+ target_arch=None,
+ codesign_identity=None,
+ entitlements_file=None,
+)
diff --git "a/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267V2.0.py" "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267V2.0.py"
new file mode 100644
index 0000000..6b27f99
--- /dev/null
+++ "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267/\345\257\206\347\240\201\346\237\245\350\257\242\345\267\245\345\205\267V2.0.py"
@@ -0,0 +1,256 @@
+import tkinter as tk
+from tkinter import messagebox, simpledialog, ttk
+import pymysql
+from Crypto.Cipher import AES
+import base64
+import json
+import os
+
+VUE_APP_EncryptPrivateValue = "12345678abcdefgh"
+HISTORY_FILE = "username_history.json"
+
+class PasswordQueryApp:
+ def __init__(self, root):
+ self.root = root
+ self.root.title("密码查询工具")
+
+ self.database_info_file = "database_info.json"
+ self.database_info = self.load_database_info()
+
+ self.create_maintenance_page()
+ self.create_query_page()
+ self.update_username_menu()
+
+ def load_database_info(self):
+ try:
+ with open(self.database_info_file, 'r') as f:
+ return json.load(f)
+ except FileNotFoundError:
+ return {}
+
+ def save_database_info(self):
+ with open(self.database_info_file, 'w') as f:
+ json.dump(self.database_info, f, indent=4)
+
+ def create_maintenance_page(self):
+ maintenance_frame = tk.LabelFrame(self.root, text="数据库信息维护")
+ maintenance_frame.pack(fill="both", expand="yes", padx=10, pady=10)
+
+ tk.Label(maintenance_frame, text="单位名称:").grid(row=0, column=0, sticky="w")
+ self.unit_name_entry = tk.Entry(maintenance_frame)
+ self.unit_name_entry.grid(row=0, column=1, padx=5, pady=5)
+
+ tk.Label(maintenance_frame, text="MySQL 主机:").grid(row=1, column=0, sticky="w")
+ self.host_entry = tk.Entry(maintenance_frame)
+ self.host_entry.grid(row=1, column=1, padx=5, pady=5)
+
+ tk.Label(maintenance_frame, text="MySQL 端口:").grid(row=2, column=0, sticky="w")
+ self.port_entry = tk.Entry(maintenance_frame)
+ self.port_entry.grid(row=2, column=1, padx=5, pady=5)
+ self.port_entry.insert(0, "3306")
+
+ tk.Label(maintenance_frame, text="MySQL 用户名:").grid(row=3, column=0, sticky="w")
+ self.user_entry = tk.Entry(maintenance_frame)
+ self.user_entry.grid(row=3, column=1, padx=5, pady=5)
+
+ tk.Label(maintenance_frame, text="MySQL 密码:").grid(row=4, column=0, sticky="w")
+ self.password_entry = tk.Entry(maintenance_frame, show="*")
+ self.password_entry.grid(row=4, column=1, padx=5, pady=5)
+
+ tk.Label(maintenance_frame, text="数据库名:").grid(row=5, column=0, sticky="w")
+ self.db_name_entry = tk.Entry(maintenance_frame)
+ self.db_name_entry.grid(row=5, column=1, padx=5, pady=5)
+
+ tk.Label(maintenance_frame, text="用户表名:").grid(row=6, column=0, sticky="w")
+ self.table_name_entry = tk.Entry(maintenance_frame)
+ self.table_name_entry.grid(row=6, column=1, padx=5, pady=5)
+ self.table_name_entry.insert(0, "sys_user")
+
+ tk.Label(maintenance_frame, text="用户名列名:").grid(row=7, column=0, sticky="w")
+ self.username_col_entry = tk.Entry(maintenance_frame)
+ self.username_col_entry.grid(row=7, column=1, padx=5, pady=5)
+ self.username_col_entry.insert(0, "login_name")
+
+ tk.Label(maintenance_frame, text="密码列名:").grid(row=8, column=0, sticky="w")
+ self.password_col_entry = tk.Entry(maintenance_frame)
+ self.password_col_entry.grid(row=8, column=1, padx=5, pady=5)
+ self.password_col_entry.insert(0, "plain_text")
+
+ save_button = tk.Button(maintenance_frame, text="保存信息", command=self.save_database_info_action)
+ save_button.grid(row=9, columnspan=2, pady=10)
+
+ def update_username_menu(self):
+ history = self.load_history()
+ menu = self.username_menu["menu"]
+ menu.delete(0, "end")
+ for name in history:
+ menu.add_command(label=name, command=lambda value=name: self.username_entry.delete(0, tk.END) or self.username_entry.insert(0, value))
+
+ def save_database_info_action(self):
+ unit_name = self.unit_name_entry.get().strip()
+ if unit_name == "":
+ messagebox.showerror("错误", "单位名称为必填项")
+ return
+
+ self.database_info[unit_name] = {
+ "host": self.host_entry.get().strip(),
+ "port": self.port_entry.get().strip(),
+ "user": self.user_entry.get().strip(),
+ "password": self.password_entry.get().strip() or "",
+ "db_name": self.db_name_entry.get().strip(),
+ "table_name": self.table_name_entry.get().strip(),
+ "username_col": self.username_col_entry.get().strip(),
+ "password_col": self.password_col_entry.get().strip()
+ }
+
+ self.save_database_info()
+ self.update_username_menu()
+ messagebox.showinfo("成功", "数据库信息保存成功")
+
+ def create_query_page(self):
+ query_frame = tk.LabelFrame(self.root, text="密码查询")
+ query_frame.pack(fill="both", expand="yes", padx=10, pady=10)
+
+ tk.Label(query_frame, text="选择单位名称:").grid(row=0, column=0, sticky="w")
+ self.unit_name_var = tk.StringVar(value="请选择单位")
+ self.unit_name_dropdown = tk.OptionMenu(query_frame, self.unit_name_var, *self.database_info.keys())
+ self.unit_name_dropdown.grid(row=0, column=1, padx=5, pady=5)
+
+ tk.Label(query_frame, text="输入用户名:").grid(row=1, column=0, sticky="w")
+ self.username_entry = tk.Entry(query_frame)
+ self.username_entry.grid(row=1, column=1, padx=5, pady=5)
+
+ query_button = tk.Button(query_frame, text="查询密码", command=self.query_password_action)
+ query_button.grid(row=2, columnspan=2, pady=10)
+
+ self.password_var = tk.StringVar()
+ tk.Label(query_frame, text="密码:").grid(row=3, column=0, sticky="w")
+ self.password_entry_login = tk.Entry(query_frame, textvariable=self.password_var, state="readonly")
+ self.password_entry_login.grid(row=3, column=1, padx=5, pady=5)
+
+ copy_button = tk.Button(query_frame, text="复制密码", command=self.copy_password)
+ copy_button.grid(row=4, column=0, pady=10)
+
+ reset_button = tk.Button(query_frame, text="重置", command=self.reset_fields)
+ reset_button.grid(row=4, column=1, pady=10)
+
+ # 用户名下拉菜单
+ tk.Label(query_frame, text="选择用户名:").grid(row=5, column=0, sticky="w")
+ self.username_menu_var = tk.StringVar()
+ self.username_menu_var.set("选择用户名")
+ self.username_menu = tk.OptionMenu(query_frame, self.username_menu_var, *self.load_history())
+ self.username_menu.grid(row=5, column=1, padx=5, pady=5)
+
+ def query_password_action(self):
+ unit_name = self.unit_name_var.get()
+ username = self.username_entry.get().strip()
+
+ if unit_name not in self.database_info:
+ messagebox.showerror("错误", "请选择有效的单位名称")
+ return
+
+ db_info = self.database_info[unit_name]
+
+ try:
+ conn = pymysql.connect(
+ host=db_info["host"],
+ port=int(db_info["port"]),
+ user=db_info["user"],
+ password=db_info["password"],
+ database=db_info["db_name"]
+ )
+ cursor = conn.cursor()
+
+ query = f"SELECT {db_info['username_col']}, {db_info['password_col']} FROM {db_info['table_name']} WHERE {db_info['username_col']} = %s"
+ cursor.execute(query, (username,))
+ result = cursor.fetchone()
+
+ if result:
+ username_db, password = result
+ if password is not None:
+ decrypted_password = self.decrypt_password(username_db, password)
+ self.password_var.set(decrypted_password)
+ else:
+ messagebox.showinfo("未找到", "未找到该用户名对应的密码")
+ else:
+ messagebox.showinfo("未找到", "未找到该用户名对应的密码")
+
+ cursor.close()
+ conn.close()
+ except pymysql.MySQLError as err:
+ messagebox.showerror("数据库错误", f"错误: {err}")
+
+ def decrypt_password(self, username, password):
+ try:
+ user_info = self.get_user_info(username)
+ if user_info:
+ encrypted_password, encryption_key = user_info
+ return self.decrypt(encrypted_password, encryption_key)
+ else:
+ return "用户信息不完整或不存在"
+ except Exception as e:
+ return f"解密错误: {e}"
+
+ def decrypt(self, encrypted_password, encryption_key):
+ try:
+ key = encryption_key.encode('utf-8')
+ iv = VUE_APP_EncryptPrivateValue.encode('utf-8')
+ encrypted_password = base64.b64decode(encrypted_password)
+ cipher = AES.new(key, AES.MODE_CBC, iv)
+ decrypted = cipher.decrypt(encrypted_password)
+ unpadded_text = decrypted.rstrip(b'\0').decode('utf-8')
+ return unpadded_text
+ except Exception as e:
+ return f"解密错误: {e}"
+
+ def get_user_info(self, username):
+ unit_name = self.unit_name_var.get()
+ if unit_name not in self.database_info:
+ return None
+
+ db_info = self.database_info[unit_name]
+ try:
+ conn = pymysql.connect(
+ host=db_info["host"],
+ port=int(db_info["port"]),
+ user=db_info["user"],
+ password=db_info["password"],
+ database=db_info["db_name"]
+ )
+ cursor = conn.cursor()
+ cursor.execute(f"SELECT {db_info['username_col']}, {db_info['password_col']} FROM {db_info['table_name']} WHERE {db_info['username_col']} = %s", (username,))
+ result = cursor.fetchone()
+ conn.close()
+ return result
+ except pymysql.MySQLError as err:
+ messagebox.showerror("数据库错误", f"错误: {err}")
+ return None
+
+ def copy_password(self):
+ decrypted_password = self.password_var.get()
+ if decrypted_password:
+ self.root.clipboard_clear()
+ self.root.clipboard_append(decrypted_password)
+ messagebox.showinfo("复制成功", "密码已复制到剪贴板")
+
+ def reset_fields(self):
+ self.username_entry.delete(0, tk.END)
+ self.password_var.set("")
+ self.unit_name_var.set("请选择单位")
+
+ def load_history(self):
+ if os.path.exists(HISTORY_FILE):
+ with open(HISTORY_FILE, 'r') as f:
+ history = json.load(f)
+ else:
+ history = []
+ return history
+
+ def save_history(self, history):
+ with open(HISTORY_FILE, 'w') as f:
+ json.dump(history, f)
+
+if __name__ == "__main__":
+ root = tk.Tk()
+ app = PasswordQueryApp(root)
+ root.mainloop()
diff --git "a/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\351\200\240\346\225\260\350\204\232\346\234\254" "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\351\200\240\346\225\260\350\204\232\346\234\254"
new file mode 160000
index 0000000..55fe8dc
--- /dev/null
+++ "b/\346\265\213\350\257\225\347\273\204/\350\204\232\346\234\254/\351\200\240\346\225\260\350\204\232\346\234\254"
@@ -0,0 +1 @@
+Subproject commit 55fe8dcda078836d49890f5f263fd5df17db5296
--
Gitblit v1.9.1