如何将散列密码存储到数据库?
How to store a hashed password to database?
我正在使用 Python 3
和 mysql.connector
模块。我无法将 hased 密码存储到数据库中。
这是我的代码:
import bcrypt
import base64, hashlib
import mysql.connector
class test:
def __init__(self):
self.cnx = mysql.connector.connect(**Connect)
self.cursor = self.cnx.cursor()
pw = "Test123!"
password=pw.encode('utf-8')
hash_pass = bcrypt.hashpw(base64.b64encode(hashlib.sha256(password).digest()),bcrypt.gensalt())
print(hash_pass)
self.cursor.execute("INSERT INTO test (password) VALUE ('%s')" % (hash_pass))
self.cnx.commit()
test()
当我运行语句INSERT
时,出现错误:
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'bJo8.yam0VU5IKQxMa4EV.ReuFGeG43wmzbrFDsT5Pr5c8L2rmlP6'')' at line 1
注意:我的 password
数据类型是 CHAR(96)
感谢您的帮助。
使用查询参数代替 string-formatting。
// WRONG
self.cursor.execute("INSERT INTO test (password) VALUE ('%s')" % (hash_pass))
// RIGHT
self.cursor.execute("INSERT INTO test (password) VALUE (%s)", (hash_pass,))
这两种方法都使用 %s
作为占位符,这有点令人困惑,因为它看起来像是在做同样的事情。但后者并没有进行简单的字符串替换。它通过转义特殊字符或使用真正的查询参数使 SQL 查询的值安全,在查询被解析之前保持值独立。
我正在使用 Python 3
和 mysql.connector
模块。我无法将 hased 密码存储到数据库中。
这是我的代码:
import bcrypt
import base64, hashlib
import mysql.connector
class test:
def __init__(self):
self.cnx = mysql.connector.connect(**Connect)
self.cursor = self.cnx.cursor()
pw = "Test123!"
password=pw.encode('utf-8')
hash_pass = bcrypt.hashpw(base64.b64encode(hashlib.sha256(password).digest()),bcrypt.gensalt())
print(hash_pass)
self.cursor.execute("INSERT INTO test (password) VALUE ('%s')" % (hash_pass))
self.cnx.commit()
test()
当我运行语句INSERT
时,出现错误:
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'bJo8.yam0VU5IKQxMa4EV.ReuFGeG43wmzbrFDsT5Pr5c8L2rmlP6'')' at line 1
注意:我的 password
数据类型是 CHAR(96)
感谢您的帮助。
使用查询参数代替 string-formatting。
// WRONG
self.cursor.execute("INSERT INTO test (password) VALUE ('%s')" % (hash_pass))
// RIGHT
self.cursor.execute("INSERT INTO test (password) VALUE (%s)", (hash_pass,))
这两种方法都使用 %s
作为占位符,这有点令人困惑,因为它看起来像是在做同样的事情。但后者并没有进行简单的字符串替换。它通过转义特殊字符或使用真正的查询参数使 SQL 查询的值安全,在查询被解析之前保持值独立。