问题描述
我使用相同的密码在 MysqL 中创建了用户,然后此代码片段使用 bcrypt 将纯文本密码更改为哈希。为什么同一个字符串的哈希值不同?
import MysqL.connector
import bcrypt
mydb = MysqL.connector.connect(
host="localhost",user="root",password="........",database="briandb",)
mycursor = mydb.cursor()
for user in ["bob","alice"]:
password = "ttt"
print(password)
hashed = bcrypt.hashpw(password.encode("utf-8"),bcrypt.gensalt())
print(hashed)
mycursor.execute(
f'UPDATE users set password = "{hashed}" where user = "{user}"'
)
mydb.commit()
解决方法
您发现了强大的密码散列的一个关键特性:每次您对密码进行散列时,都会得到不同的结果。为什么?
每次都使用不同的随机盐(来自此处的 bcrypt.gensalt()
)。
为什么这很重要?
如果网络蠕虫闯入您的系统并窃取您的 users
表,他们将拥有您的加盐哈希密码。当散列正确完成时,恢复未加盐的密码是非常困难的。如果他们接下来闯入银行系统并窃取他们的散列密码,我们不希望他们能够得出结论,某些用户在两个系统上具有相同的密码。如果他们能猜到这一点,他们就会知道针对哪些用户进行更深入的网络犯罪。