<p>首先,必须指出<code>secret.encode('UTF-8')</code>的结果与<code>base64.b32encode(bSecret)</code>的结果具有完全相同的类型(对于这一点,<code>base64.b64encode(bSecret)</code>)它们都返回{<cd4>}对象。同样值得注意的是,Python中的<a href="https://github.com/python/cpython/blob/3.7/Lib/hmac.py" rel="nofollow noreferrer">implementation of ^{<cd5>}</a>没有提到base64/base32编码。所以简单的回答是,<code>807244</code>的预期结果只有在共享机密是base64/UTF-8编码的blob时才有效。在</p>
<p>这个简短的代码片段显示,您确实可以给<code>hotp</code>任何字节,并且它将得到一些结果(因为在示例中,<code>hotp</code>被多次调用,<code>counter</code>被更改)</p>
<pre class="lang-py prettyprint-override"><code># ... everything from your example above ...
secret = "1234"
secret_bytes = secret.encode("UTF-8")
secret_bytes
>>> b'1234'
b32_secret = base64.b32encode(bSecret)
b32_secret
>>> b'GEZDGNA='
b64_secret = base64.b64encode(bSecret)
b64_secret
>>> b'MTIzNA=='
hotp(secret_bytes, counter) # just a UTF-8 blob works
>>> '110366'
hotp(b32_secret, counter) # base32/UTF-8 also works
>>> '896513'
hotp(b64_secret, counter) # base64/UTF-8 works as well
>>> '806744'
</code></pre>
<p>如果您更详细地了解为什么您希望<code>807244</code>为base32/UTF8 blob,我很乐意修改这个答案。在</p>