在Python TKinter授权系统中实现数据库密码MD5哈希功能
TKinter登录表单MD5密码验证改造
针对你的需求,以下是修改后的完整代码,核心实现了密码MD5哈希存储与验证,同时修复了原代码的SQL注入风险:
from tkinter import * import sqlite3 from tkinter import messagebox as mb import hashlib def get_md5_hash(password): # 生成密码的MD5哈希值,返回十六进制字符串 md5 = hashlib.md5() md5.update(password.encode('utf-8')) return md5.hexdigest() # 初始化数据库 conn = sqlite3.connect('sotrudniki.db') cur = conn.cursor() cur.execute("""CREATE TABLE IF NOT EXISTS users( login TEXT UNIQUE, pswd TEXT);""") conn.commit() clr = "#072f41" fg = "#ffffff" entry = "#355e7e" aut = Tk() aut.title("授权登录") aut["bg"] = clr aut.geometry('320x320') aut.resizable(width=0, height=0) def vhod(): username = enlog.get().strip() password = enpw.get().strip() if not username or not password: mb.showerror("错误", "用户名或密码不能为空") return # 对用户输入的密码生成MD5哈希 hashed_pwd = get_md5_hash(password) # 使用参数化查询避免SQL注入 cur.execute("SELECT pswd FROM users WHERE login = ?", (username,)) result = cur.fetchone() if result and result[0] == hashed_pwd: mb.showinfo("成功", "授权成功!") aut.destroy() else: mb.showerror("错误", "用户名或密码错误") enlog.delete(0, END) enpw.delete(0, END) # UI部分 lb = Label(aut, text = "AUTH", font = ("Times", 25), bg=clr, fg=fg) lb.pack(pady=20) lblog = Label(aut, text = "LOGIN", font = ("Times", 18), bg=clr, fg=fg) lblog.pack() enlog = Entry(aut, font = ("Times", 15), fg=fg, bg=entry) enlog.pack() lbpw = Label(aut, text = "PASSWORD", font = ("Times", 18), bg=clr, fg=fg) lbpw.pack() enpw = Entry(aut, font = ("Times", 15), fg=fg, bg=entry, show = "*") enpw.pack() bt = Button(aut, text = "登录", font = ("Times", 25), fg=fg, bg=entry, width = 10, command = vhod) bt.pack(pady = 25, padx = 10) aut.mainloop() # 关闭数据库连接 conn.close()
关键改动说明:
- MD5哈希生成函数:
get_md5_hash函数负责将明文密码转换为MD5十六进制哈希字符串,确保密码以加密形式存储和比对。 - 安全的SQL查询:替换了原代码中危险的字符串拼接方式,改用SQLite参数化查询(
?占位符),彻底避免SQL注入攻击。 - 登录验证逻辑:先对用户输入的密码做MD5哈希,再查询数据库中对应用户的哈希值进行比对,而不是直接比对明文。
- 数据库优化:给
login字段添加UNIQUE约束,避免重复用户名;操作数据库后添加commit()确保表结构修改生效。 - 用户体验优化:细化错误提示信息,让用户清楚知道错误原因。
数据库录入注意事项:
使用DB Browser for SQLite添加用户时,密码字段必须填入明文密码的MD5哈希值,而不是明文。例如:
- 明文密码
123456对应的MD5哈希是e10adc3949ba59abbe56e057f20f883e - 你可以通过以下代码生成哈希:
import hashlib print(hashlib.md5("你的明文密码".encode('utf-8')).hexdigest())
内容的提问来源于stack exchange,提问作者Jont
相关产品推荐
相关产品推荐

