<p>您正在使用两种不同的算法来创建<a href="https://en.wikipedia.org/wiki/Message_authentication_code" rel="nofollow noreferrer"><em>Message Authentication Code</em></a>,即MAC。你知道吗</p>
<p>当您使用<code>hmac</code>模块时,您正在创建一个<em>散列的</em>MAC或<a href="https://en.wikipedia.org/wiki/HMAC" rel="nofollow noreferrer">HMAC</a>。这里,密钥被使用两次(每次使用不同的XOR掩码)来预加值到数据,并且哈希函数(由<code>hashlib</code>库提供)被用于一次一块地处理输入数据,以便在两步处理中,首先将数据“压缩”为内部值,然后在预加第二个密钥之后将外部值。这使得算法非常灵活,因为任何块散列都可以适应这种技术。你知道吗</p>
<p>BLAKE2,加上一个密钥,也可以用来创建一个MAC,但是散列函数<em>本身</em>使用这个密钥产生一个“秘密”散列输出,一个只能用同一个密钥验证的输出,所以也产生了一个安全的签名。它通过使密钥成为迭代散列操作的第一个块来实现这一点。你知道吗</p>
<p>但是Blake2<em>没有键,只是另一个散列函数,就像SHA256和其他函数一样,当你在HMAC中使用它时,不同的方法会产生不同的结果。这两种算法不兼容,因为这两种算法使用的密钥非常不同。你知道吗</p>
<p>引用<a href="https://tools.ietf.org/html/rfc7693#section-1" rel="nofollow noreferrer">RFC 7693 – <em>BLAKE2 Crypto Hash and MAC</em></a>:</p>
<blockquote>
<p>BLAKE2 does not require
a special "HMAC" (Hashed Message Authentication Code) construction
for keyed message authentication as it has a built-in keying
mechanism.</p>
</blockquote>
<p>从<a href="https://docs.python.org/3/library/hashlib.html#blake2" rel="nofollow noreferrer">BLAKE2 section of the ^{<cd2>} documentation</a>开始:</p>
<blockquote>
<p>BLAKE2 supports keyed mode (a faster and simpler replacement for HMAC), [...]</p>
</blockquote>
<p><code>salt</code>函数的<code>hashlib.blake2b()</code>参数是BLAKE2散列算法的一个不同特性,否则只需在salt前面加上散列的明文即可。salt对输出进行“随机”处理,这样就不太可能对同一条输入消息产生两次相同的输出(这使得第三方无法检测到重复的消息)。你知道吗</p>