我正在调用bcrypt.checkpw
检查未加密的密码匹配,并使用存储在凭证数据库中的散列密码,但是接收
TypeError:必须在检查
之前编码Unicode对象
我该如何解决这个问题?有什么建议吗?
我安装了python 2.7.6
和bcrypt 3.1.1
我有以下代码:
def check_password(password, hashed_password)
if not bcrypt.checkpw(password, hashed_password):
raise InvalidCredentials("403 Forbidden")
else:
return true
并收到以下错误:
文件" /home/qt/virtualenv/lib/python2.7/site-packages/bcrypt/ init .py",第100行,在checkpw中 提出TypeError(" Unicoed-objects必须在检查&#34之前编码;)
之前编码Unicode对象
TypeError:必须在检查
我调查bcrypt/__init__.py
,但我不确定原因
def checkpw(password, hashed_password):
if (isinstance(password, six.text_type) or
isinstance(hashed_password, six.text_type)):
raise TypeError("Unicode-objects must be encoded before checking")
答案 0 :(得分:12)
我假设您使用Python 3.对于Python 3,字符串默认为unicode字符串。
如果使用unicode值调用bcrypt.checkpw()
函数:
import bcrypt
password = "seCr3t" # unicode string
hashed_password = "hashed_seCr3t" # unicode string
bcrypt.checkpw(password, hashed_password)
你会得到这个例外
Traceback (most recent call last):
...
TypeError: Unicode-objects must be encoded before checking
原因很简单:加密函数仅适用于字节字符串(或实际上是数组)。
你密码和 hashed_password 必须都是字节字符串。
如果您使用bcrypt.hashpw()
函数,则 hashed_password 必须是字节字符串,我认为问题出在密码值上。此密码必须来自类似的HTML表单。要使用bcrypt.checkpw()
函数,必须首先使用与{{1>}函数加密密码相同的编码对字符串值进行编码。通常,我们选择'utf8'编码。
例如(Python 2& 3):
bcrypt.hashpw()
上的简单用法
答案 1 :(得分:4)
Something you could do like this
bcrypt.checkpw(password.encode('utf-8'), hashed_password.encode('utf-8'))
simple does it
答案 2 :(得分:1)
我使用类似的东西
class User(Base):
__tablename__ = "user"
id = Column(BigInteger, primary_key=True, autoincrement=True)
login = Column(String, nullable=False, unique=True)
password = Column(String, nullable=False)
@staticmethod
def make_password_hash(password):
hash = bcrypt.hashpw(password=password.encode('utf-8'), salt=bcrypt.gensalt())
return hash.decode('utf-8')
def is_password_valid(self, password):
return bcrypt.checkpw(password.encode('utf-8'), self.password.encode('utf-8'))
答案 3 :(得分:0)
像这样使用并查看代码下方的注释:
import bcrypt
def comparacaoSenha(passw, hash):
if bcrypt.checkpw(passw, hash):
print("It Matches!")
else:
print("It Does not Match")
password = "super secret password".encode('utf-8')
password2 = "another password".encode('utf-8')
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
heashed2 = bcrypt.hashpw(password2, bcrypt.gensalt())
print("Teste 1: ")
print("-----------------------------")
print("PASSWORD: ", password)
print("HASHED PW: ", hashed)
comparacaoSenha(password, hashed)
print("-----------------------------")
print("Teste 2: ")
print("-----------------------------")
print("PASSWORD: ", password2)
print("HASHED PW: ", heashed2)
comparacaoSenha(password2, heashed2)
print("-----------------------------")
# Things to remember:
# always use the encode('utf-8') or put a prefix 'b'' just before the strings
# EX: newPass = b"OTHER PASSWORD" // or newPass="OTHER PASSWORD".encode('utf-8')
#