代码之家  ›  专栏  ›  技术社区  ›  GJK

为什么我有时会在Java和PHP中得到不同的SHA256哈希?

  •  2
  • GJK  · 技术社区  · 13 年前

    所以我对PHP中的哈希函数有一个奇怪的小问题。这种情况只会偶尔发生,这让我很困惑。本质上,我有一个Java应用程序和一个PHP页面,它们都计算同一字符串的SHA256。两者之间没有任何问题,因为它们计算的哈希值(通常)相同。一个例外是,每隔一段时间,PHP的输出就会比Java的长一个字符。

    我有以下PHP代码:

    $token = $_GET["token"];
    $token = hash("sha256", $token."<salt>");
    echo "Your token is " . $token;
    

    99%的时间,我得到了正确的散列。但每隔一段时间,我就会收到这样的东西(添加空格以显示差异):

    26be60ec9a36f217df83834939cbefa33ac798776977c1970f6c38ba1cf92e92 # PHP
    26be60ec9a36f217df83834939cbefa33ac798776977c197 f6c38ba1cf92e92 # Java
    

    正如你所看到的,它们几乎完全相同。但由于某种原因,顶部的一个(由PHP计算)又多了一个0。我还没有真正注意到其中的押韵或原因,但这确实让我感到困惑。我试过思考错误的编码或错误的返回值等问题,但没有一个能真正解释为什么除了那一个字符之外,它们几乎完全相同。

    如能在这个问题上提供任何帮助,我们将不胜感激。

    编辑:空格只在底部,以突出显示多余的0所在的位置。实际的哈希没有空格,而且确实是一个有效的哈希,因为它与Java生成的哈希相同。

    第二版:很抱歉。我用Notepad++检查了长度,由于它与我的普通文本编辑器不同,我将长度误读了1。所以,是的,上面的那个确实是对的。这意味着这是我的Java代码中的一个错误。我将探究伊格纳西奥的答案并回复你。

    2 回复  |  直到 13 年前
        1
  •  4
  •   Ignacio Vazquez-Abrams    13 年前

    顶部散列是正确的长度;底部散列被输出,因为十六进制值在输出时没有被零填充(注意,它是字节的MSn)。因此,Java程序中的一个错误与哈希算法无关。

    >>> '%04x %02x%02x %x%x' % (0x1201, 0x12, 0x01, 0x12, 0x01)
    '1201 1201 121'
    
        2
  •  2
  •   LSerni    13 年前

    实际上,这是第二个散列,它的长度似乎不正确(63)。它可能是通过组装两个不同的令牌生成的,而最后一个令牌(应该是16个字符)可能会去掉最初的零?

    推荐文章