QCryptographicHash :: Sha3_256在Qt5.4和Qt5.8中有所不同

时间:2018-10-05 11:43:01

标签: qt encryption hash cryptography sha

我使用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。我在做什么错了?

1 个答案:

答案 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.85.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中具有含义。