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

问题描述

我使用相同的密码在 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 表,他们将拥有您的加盐哈希密码。当散列正确完成时,恢复未加盐的密码是非常困难的。如果他们接下来闯入银行系统并窃取他们的散列密码,我们不希望他们能够得出结论,某些用户在两个系统上具有相同的密码。如果他们能猜到这一点,他们就会知道针对哪些用户进行更深入的网络犯罪。