我使用QCryptographicHash::hash(data, QCryptographicHash::Sha3_256).toHex()函数对密码123456进行编码,得到了两个不同的结果:
Qt5.4: c888c9ce9e098d5864d3ded6ebcc140a12142263bace3a23a36f9905f12bd64a
Qt5.8: d7190eb194ff9494625514b6d178c87f99c5973e28c398969d2233f2960a573eQt文档中有这样的说法:
注意:在5.9之前的Qt版本中,当被要求生成SHA3散列和时,QCryptographicHash实际上计算了Keccak。如果您需要与那些版本的Qt生成的SHA-3散列兼容,请使用Keccak_枚举器。或者,如果需要源代码兼容性,则定义宏QT_SHA3_KECCAK_COMPAT。
但我使用Qt5.8来源于GitHub5.8分支!不是5.9。我做错了什么?
发布于 2018-10-06 15:45:19
您可以使用在线工具(如这一个 )计算密码的SHA3_256哈希,并使用类似的这一个计算Keccak-256哈希。它显示了你在问题中所显示的确切结果。
因此,马腾的话似乎是正确的:在文档中写入的行为在某个时候被引入到5.8分支中。您可以在5.8中亲自看到这种情况发生的地方。您还可以看到,这是应用完成的。
因此,如果您切换回标记为v5.8.0的版本,您将得到与在5.4中相同的行为。
更新以回复您的评论。
文档中描述的机制,即定义宏QT_SHA3_KECCAK_COMPAT以保持与旧版本的向后兼容性,不支持5.8。显示5.8和5.9分支之间的相关差异(在这里,我减少了输出):
git difftool -y -x "diff -y -W 72" 5.8 5.9 -- qcryptographichash.h
enum Algorithm { enum Algorithm {
#ifndef QT_CRYPTOGRAPHICHASH_ONL #ifndef QT_CRYPTOGRAPHICHASH_ONL
Md4, Md4,
Md5, Md5,
#endif #endif
Sha1 = 2, Sha1 = 2,
#ifndef QT_CRYPTOGRAPHICHASH_ONL #ifndef QT_CRYPTOGRAPHICHASH_ONL
Sha224, Sha224,
Sha256, Sha256,
Sha384, Sha384,
Sha512, Sha512,
Sha3_224, |
Sha3_256, | Keccak_224 = 7,
Sha3_384, | Keccak_256,
Sha3_512 | Keccak_384,
> Keccak_512,
> RealSha3_224 = 11,
> RealSha3_256,
> RealSha3_384,
> RealSha3_512,
> # ifndef QT_SHA3_KECCAK_COMPAT
> Sha3_224 = RealSha3_224,
> Sha3_256 = RealSha3_256,
> Sha3_384 = RealSha3_384,
> Sha3_512 = RealSha3_512
> # else
> Sha3_224 = Keccak_224,
> Sha3_256 = Keccak_256,
> Sha3_384 = Keccak_384,
> Sha3_512 = Keccak_512
> # endif
#endif #endif
}; };如您所见,宏QT_SHA3_KECCAK_COMPAT在5.9中只有一个意义。
https://stackoverflow.com/questions/52664903
复制相似问题