【发布时间】:2020-03-01 05:01:26
【问题描述】:
我正在尝试使用 Tkinter GUI 在 Python 中创建登录程序,并使用 hashlib MD5 对密码进行哈希处理。这是我的帐户创建代码。
def AccountEntry():
tk.Label(m, text = "Account Creation").grid(row =2 ,column =1)
tk.Label(m, text = "Enter name").grid(row = 3, column = 0)
ename = tk.Entry(m)
ename.grid(row = 3, column = 1)
tk.Label(m, text = "Enter password").grid(row = 4,column = 0)
epassword = tk.Entry(m, show = "*")
epassword.grid(row = 4, column = 1)
tk.Button(m, text = "Submit", command = lambda:Account(epassword,ename)).grid(row = 5, column = 1)
def Account(epassword,ename):
name = ename.get()
password = epassword.get()
bytepass = bytes(password, 'utf-8')
hexpass = str(hashlib.md5(bytepass))
enter_table = (name,hexpass)
cursor.execute("insert into lusers(name, hexpass) values(%s,%s)",(enter_table))
db.commit()
tk.Label(m, text = "Successfully made account").grid(row = 6, column = 1)
问题基本上是md5函数返回不同的值。所以我第一次按“提交”时,它返回“md5 HASH object @ 0x03845C68”,但从第二次开始,当我使用相同的名称和密码按“提交”时,它返回“md5 HASH object @ 0x03845DE8”。这会产生一个问题,因为为了登录,程序获取密码,再次使用散列函数,然后将新的散列对象与数据库中的对象进行比较,这是不同的,因为它弄乱了帐户创建中的值。
我怀疑 str(hashlib.md5(bytepass)) 可能与它有关,因为它在登录中做同样的事情,直到我删除 str(),但我需要将哈希对象转换为将其放入 MySQL 的字符串。
【问题讨论】:
-
这些数字是对象的内存地址,而不是散列值。你能打印一个哈希字符串来检查吗?查看@chepner 的回答
-
使用
hashlib.md5(value).hexdigest()而不是str(...)。 -
您应该考虑使用现有框架或阅读有关身份验证的最佳实践...我不是专家,但对于初学者来说,未加盐的密码是一个很大的问题,因此进行单轮哈希也是如此。有专门用于密码哈希的哈希函数...
标签: python mysql tkinter md5 hashlib