我使用QCryptographicHash::hash(data, QCryptographicHash::Sha3_256).toHex()
编码密码123456
的函数,我得到两个不同的结果:
Qt5.4: c888c9ce9e098d5864d3ded6ebcc140a12142263bace3a23a36f9905f12bd64a
Qt5.8: d7190eb194ff9494625514b6d178c87f99c5973e28c398969d2233f2960a573e
在Qt文档中说:
注意:在5.9之前的Qt版本中,当被要求 生成SHA3哈希和,实际计算出的QCryptographicHash Keccak。如果您需要与由它们产生的SHA-3散列兼容 版本的Qt,请使用Keccak_枚举器。或者,如果来源 需要兼容性,请定义宏QT_SHA3_KECCAK_COMPAT。
但是我使用来自github 5.8分支的Qt5.8源码!不是5.9。我在做什么错了?
答案 0 :(得分:3)
您可以使用this one之类的在线工具来计算密码的SHA3_256哈希值,并且类似地使用this one来计算Keccak-256哈希值。它会显示您在问题中显示的确切结果。
所以Maarten's remark似乎是正确的:该文档中记录的行为在某个时候引入了5.8
分支。您可以在发生这种情况的git history of the file qcryptographichash.cpp
in the branch called 5.8
中亲眼看到。您还可以看到after the tag v5.8.0
was applied已经完成。
因此,如果切换回标记为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
中具有含义。