检查 mysql 中存储的 table 中是否存在用户名、散列和密钥时出错

Error when checking if username, hash, and key exists in a table stored in mysql

程序的输出:

欢迎,请输入您的用户名和密码 输入 username:Manas 输入 password:123456 错误2 错误3

下面是程序的最小代码:

import mysql.connector
import hashlib
import os
mycon=mysql.connector.connect(host="localhost",user="root",passwd="123456",database="library",use_unicode=True,charset="utf8")
cursor=mycon.cursor()
stmt = "SHOW TABLES LIKE 'users'"
cursor.execute(stmt)
result = cursor.fetchone()
if result:
    pass
else:
    cursor.execute("create table users(username varchar(20),key varbinary(100),salt varbinary(100));")
def users(username,password):
    cursor.execute("select * from users where username='{}'".format(username))
    data=cursor.fetchone()
    if data=="(NULL)":
        return False
    elif data==True:
        salt=data[2]
        key=hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), salt, 100000)
        if data[1]==key:
            return True
        elif data[1]!=key:
            return False
        else:
            print("error1")
    else:
        print("error2")
        return False
#Main program
print("WELCOME, PLEASE ENTER YOUR USERNAME AND PASSWORD")
username=input("Enter username:")
password=input("Enter password:")
users(username,password)
if users==True:
    print("user exists")
elif users==False:
    print("user does not exist")
else:
    print("Error3")

它被引用的 table:

mysql> use library;
Database changed
mysql> select * from users;
+----------+--------------------------------------------------------------------+--------------------------------------------------------------------+
| username | key                                                                | salt                                                               |
+----------+--------------------------------------------------------------------+--------------------------------------------------------------------+
| Manas    | 0xE42AB9B18A8F144EA7933FFA8E69E1FE28F20DA67B3E0FF3F1A0C2203D6148B2 | 0xF68894D924A69D035CC096C497F933B29A08E075F6DA2B19D955D08A33C0CAB4 |
+----------+--------------------------------------------------------------------+--------------------------------------------------------------------+
1 row in set (0.00 sec)

打印(数据):

WELCOME, PLEASE ENTER YOUR USERNAME AND PASSWORD
Enter username:Manas
Enter password:12345
('Manas', bytearray(b'\xe4*\xb9\xb1\x8a\x8f\x14N\xa7\x93?\xfa\x8ei\xe1\xfe(\xf2\r\xa6{>\x0f\xf3\xf1\xa0\xc2 =aH\xb2'), bytearray(b'\xf6\x88\x94\xd9$\xa6\x9d\x03\\xc0\x96\xc4\x97\xf93\xb2\x9a\x08\xe0u\xf6\xda+\x19\xd9U\xd0\x8a3\xc0\xca\xb4'))
error2
Error3

为什么会这样?

您还必须建立连接,以便它使用 utf8

假设你有 uft8mb4

mycon=mysql.connector.connect(host="localhost"
                                   ,user="root"
                                   ,passwd="123456"
                                   ,database="library"
                                   ,charset="utf8mb4")

字符集cp也应该是utf8,你要查一下

并在处理参数时使用准备好的语句

cursor.execute("select * from users where username=%s",(username,))

更新

此外,您的 table 定义有问题 key 是 MySQL 中的保留字,因此您需要将其封装在反引号中,如下所示

cursor.execute("create table users(username varchar(20),`key` varbinary(100),salt varbinary(100));")

更新 2

在测试你的代码后我发现了一些问题

你的函数返回一个你从未赋值的值

如果没有用户,则数据为 NULL

import mysql.connector
import hashlib
import os
mycon=mysql.connector.connect(host="localhost",user="root",passwd="123456",database="library",use_unicode=True,charset="utf8mb4")
cursor=mycon.cursor()
stmt = "SHOW TABLES LIKE 'users'"
cursor.execute(stmt)
result = cursor.fetchone()
if result:
    pass
else:
    cursor.execute("create table users(username varchar(20),`key` varbinary(100),salt varbinary(100));")
def users(username,password):
    cursor.execute("select * from users where username=%s",(username,))
    data=cursor.fetchone()
    if data  is None :
        return False
    elif data is not None:
        salt=data[2]
        key=hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), salt, 100000)
        if data[1]==key:
            return True
        elif data[1]!=key:
            return False
        else:
            print("error1")
    else:
        print("error2")
        return False
#Main program
print("WELCOME, PLEASE ENTER YOUR USERNAME AND PASSWORD")
username=input("Enter username:")
password=input("Enter password:")
users = users(username,password)
if users==True:
    print("user exists")
elif users==False:
    print("user does not exist")
else:
    print("Error3")