【问题标题】:MD5 Hash function changing data in PythonMD5哈希函数在Python中改变数据
【发布时间】: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


【解决方案1】:

您没有从该调用中获得 md5 哈希值;你得到了一个 object,它有一个可以返回 md5 哈希的方法。

hexpass = hashlib.md5(bytepass).hexdigest()

【讨论】:

  • 如果我尝试把它放在 MySQL 中,它会给出类型错误:Python 'builtin_function_or_method' cannot be convert to a MySQL type
  • 您似乎在某处缺少括号;你用的是hexdigest还是hexdigest()
猜你喜欢
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
相关资源
最近更新 更多