所以我有一个数据库,其中一串散列密码存储在字符串中。现在,我尝试将其下拉,然后将其与用户输入的纯文本密码进行比较。这是一个示例:
import bcrypt
# at creation first:
password = u"seCr3t"
hashed_password = bcrypt.hashpw(password.encode('utf8'), bcrypt.gensalt())
print(hashed_password)
#example of it being stored in the database
hashed_password = str(hashed_password)
# first attempt:
password = u"seCrEt"
print(bcrypt.checkpw(password.encode('utf8'), hashed_password.encode('utf8')))
# -> False
# second attempt:
password = u"seCr3t"
print(bcrypt.checkpw(password.encode('utf8'), hashed_password.encode('utf8')))
# -> True
# However I get the error "Invalid Salt"
我不知道如何解决此错误,也无法在线找到更多有关此错误的信息。任何帮助,将不胜感激。谢谢
答案 0 :(得分:0)
问题是您将密码强制转换为字符串。使用解码和编码来确保将密码转换为使用相同格式的字符串并返回。
import bcrypt
password = u"seCr3t"
hashed_password = bcrypt.hashpw(password.encode('utf8'), bcrypt.gensalt())
# convert to string with correct format
string_password = hashed_password.decode('utf8')
password = u"seCr3t"
# convert back to bytes with correct format
print(bcrypt.checkpw(password.encode('utf8'), string_password.encode('utf8')))
# True
无论如何我都不是编码格式方面的专家,因此这可能并非在所有情况下都有效。如果您的字节对象中包含无法使用utf8表示的字符,则可能会导致问题。我将研究存储密码的最佳做法。也许您甚至可以使用pickle来直接存储python对象。