如何在 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'
这里我有一个使用 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'