<p>我假设您使用Python 3。在Python 3中,默认情况下,字符串是unicode字符串。</p>
<p>如果使用unicode值调用<code>bcrypt.checkpw()</code>函数:</p>
<pre><code>import bcrypt
password = "seCr3t" # unicode string
hashed_password = "hashed_seCr3t" # unicode string
bcrypt.checkpw(password, hashed_password)
</code></pre>
<p>你会得到这个例外</p>
<pre><code>Traceback (most recent call last):
...
TypeError: Unicode-objects must be encoded before checking
</code></pre>
<p>原因很简单:加密函数只对字节字符串(或者实际上是数组)起作用。</p>
<p>密码</em>和哈希密码</em>必须都是字节字符串。</p>
<p>如果您使用<code>bcrypt.hashpw()</code>函数,那么您的散列密码必须是字节字符串,我认为问题在于<em>password</em>值。这个<em>密码</em>必须来自类似的HTML表单。要使用<code>bcrypt.checkpw()</code>函数,必须首先使用与使用<code>bcrypt.hashpw()</code>函数加密<em>密码</em>时使用的相同编码对字符串值进行编码。通常,我们选择“utf8”编码。</p>
<p>例如(Python 2&3):</p>
<pre><code>import bcrypt
# at creation first:
password = u"seCr3t"
hashed_password = bcrypt.hashpw(password.encode('utf8'), bcrypt.gensalt())
# first attempt:
password = u"seCrEt"
bcrypt.checkpw(password.encode('utf8'), hashed_password)
# -> False
# second attempt:
password = u"seCr3t"
bcrypt.checkpw(password.encode('utf8'), hashed_password)
# -> True
</code></pre>
<p>请参阅<a href="https://github.com/pyca/bcrypt/#usage" rel="noreferrer">Gihub page</a>上的简单用法</p>