如何在mysql中存储编码密码
Posted
技术标签:
【中文标题】如何在mysql中存储编码密码【英文标题】:How to store encoded password in mysql 【发布时间】:2021-06-27 12:27:03 【问题描述】:这里我有一个在 python 中使用 hashlib.pbkdf2_hmac 和 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 语法错误
最好的方法是什么?
【问题讨论】:
您刚刚向我们展示的内容有什么问题? 除了元组之外阻止的东西至少需要两个维度 【参考方案1】: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'
【讨论】:
以上是关于如何在mysql中存储编码密码的主要内容,如果未能解决你的问题,请参考以下文章