如何在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中存储编码密码的主要内容,如果未能解决你的问题,请参考以下文章

如何查看设置mysql数据库编码方式

我应该如何在 MySQL 数据库中存储 ftp 登录凭据?

如何修改mysql数据库中的用户名和密码

如何查看设置mysql数据库编码方式

mysql密码为空,springboot2的yaml配置时如何填写

如何在 MySQL (PhpMyAdmin) 的用户表中“散列”我的密码?