如何在 mysql 中存储编码密码

How to store encoded password in mysql

这里我有一个使用 hashlib.pbkdf2_hmac 和 python

中的 sha256 编码的密码
>>> import hashlib
>>> password = 'mypassword123'
>>> encoded_password = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), b'', 100000)
>>> encoded_password
b"\r\x8ay\xcceKwv\x90\x13:~GKX\x13#@K\x00\x98\xcd\xc4\x0e\x9eV\x9e>\xd6\xdaf'"

>>> len(encoded_password)
32

现在我想将此编码数据存储在 MYSQL CHAR(32) 字段中,例如:

>>> cursor.execute('INSERT INTO `table`(char_32_field) VALUES (%s)', (encoded_password, ))

当然,我在上面的行中遇到 SQL 语法错误

最好的方法是什么?

encoded_password 是二进制数据,因此将其存储在 CHAR 列中可能会导致 INCORRECT STRING VALUE 错误。请改用 BINARY 列。

例如使用pymysql作为连接器

import hashlib

import pymysql


DDL1 = """DROP TABLE IF EXISTS test"""
DDL2 = """CREATE TABLE test (password binary(32))"""

with pymysql.connect(database='test') as cur:
    cur.execute(DDL1)
    cur.execute(DDL2)
    password = 'password123'
    encoded_password = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), b'', 100000)
    cur.execute("""INSERT INTO test (password) VALUES (%s)""", (encoded_password,))


with pymysql.connect(database='test') as cur:
    cur.execute("""SELECT password FROM test LIMIT 1""")
    pw, = cur.fetchone()
    print(type(pw), pw) 

产出

<class 'bytes'> b'BY\xab\x06\xe0\xcf\x15\x9fy#\xa4N\xa6M\xcf\xc2\xee\xaa\xfa\xd0zo\x04\x9b~\xb1_\xbe\x89\x99W\xa1'