所以我对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生成的散列相同。
EDIT2:对不起。我用Notepad ++检查了长度,因为它与我的普通文本编辑器不同,我把长度误读为1.所以是的,最重要的是确实是正确的。这意味着它是我的Java代码中的一个错误。我将探讨伊格纳西奥的回答并回复你。
答案 0 :(得分:4)
顶部哈希是正确的长度;输出底部哈希是因为十六进制值在输出上没有填充(注意它是一个字节的MSn)。因此,Java程序中的一个错误与哈希算法无关。
>>> '%04x %02x%02x %x%x' % (0x1201, 0x12, 0x01, 0x12, 0x01)
'1201 1201 121'
答案 1 :(得分:2)
实际上它是SECOND哈希,似乎长度不正确(63)。难道它是通过组装两个不同的标记生成的,也许最后一个 - 应该是16个字符 - 是否删除了初始零点?