bcrypt 相同字符串的不同哈希值?

bcrypt different hash for same string?

我在 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()这里)。

为什么这很重要?

如果 cybercreep 侵入您的系统并窃取您的 users table,他们将获得您的加盐哈希密码。正确完成散列后,很难恢复未加盐的密码。如果他们接下来闯入银行系统并窃取他们的散列密码,我们不希望他们能够得出某些用户在两个系统上拥有相同密码的结论。如果他们能猜到这一点,他们就会知道针对哪些用户进行更深入的网络犯罪。