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

在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()

关键改动说明:

  1. MD5哈希生成函数:get_md5_hash函数负责将明文密码转换为MD5十六进制哈希字符串,确保密码以加密形式存储和比对。
  2. 安全的SQL查询:替换了原代码中危险的字符串拼接方式,改用SQLite参数化查询(?占位符),彻底避免SQL注入攻击。
  3. 登录验证逻辑:先对用户输入的密码做MD5哈希,再查询数据库中对应用户的哈希值进行比对,而不是直接比对明文。
  4. 数据库优化:给login字段添加UNIQUE约束,避免重复用户名;操作数据库后添加commit()确保表结构修改生效。
  5. 用户体验优化:细化错误提示信息,让用户清楚知道错误原因。

数据库录入注意事项:

使用DB Browser for SQLite添加用户时,密码字段必须填入明文密码的MD5哈希值,而不是明文。例如:

  • 明文密码123456对应的MD5哈希是e10adc3949ba59abbe56e057f20f883e
  • 你可以通过以下代码生成哈希:
import hashlib
print(hashlib.md5("你的明文密码".encode('utf-8')).hexdigest())

内容的提问来源于stack exchange,提问作者Jont

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:15:13