繁体   English   中英

Javascript Sha256 vs PHP Sha256:换行创建不同的哈希?

[英]Javascript Sha256 vs PHP Sha256: Line breaks create different hash?

添加换行符时,我得到两个不同的哈希值。

在这个网站http://www.xorbin.com/tools/sha256-hash-calculator上有一个JavaScript Sha256哈希生成器。

当我在“onetwo”上运行哈希时,我得到:

25b6746d5172ed6352966a013d93ac846e1110d5a25e8f183b5931f4688842a1

当我使用PHP时

echo hash('sha256', 'onetwo');

我明白了:

25b6746d5172ed6352966a013d93ac846e1110d5a25e8f183b5931f4688842a1

但是当我从包含换行符(返回)的URL运行哈希时,如:

'one
two'

我明白了:

21066d108d5319ecb5a1fc4454f42ef22fc5f1c7df49c31d90294950e0ea8b2c

但是当我使用PHP时,我得到:

29a776bb35efe730dabb1b1d3ad74dbf80cc3e9009e168241798ea73adca3dcf

任何人都可以指出为什么会这样吗? 为什么添加换行符会产生不同的结果?

这是我的PHP / HTML代码,您将看到我正在使用表单并提交要散列的数据。

<!DOCTYPE HTML>
<html>
  <head>
    <title>Sha256 Hash</title>
  </head>
  <body>
    <div style="float: left;">
      Start here and insert text below to be hashed.<br />
      <form name="submit hash" action="" method="POST">
        <textarea name="text" style="border: thin solid #000; width: 500px; padding: 10px; height: 500px;"><? if($_SERVER['REQUEST_METHOD'] == 'POST') echo $_POST['text']; ?></textarea>
        <br style="clear: both;" />
        <input type="submit" name="submit" value="submit" />
      </form>
    </div>
    <? if($_SERVER['REQUEST_METHOD'] == 'POST'): ?>
    <div style="border: thin solid #000; margin: 10px; padding: 10px; float: left;">
      <br />sha256:&nbsp;&nbsp;<b><?= hash('sha256',$_POST['text']); ?></b><br />
    </div>
    <? endif; ?>
  </body>
</html>

@mrjoltcola是对的。

从textarea获取值时,新行为\\ r \\ n(CRLF)。

您可以通过打印您读取的字符串的url编码版本在您的PHP代码中验证这一点:

var_dump(urlencode($_POST['text']));

如果输入,这将打印string(12) "one%0D%0Atwo"

one
two

其中%0D是回车的html代码,换行的%0A,如此处所示

现在要获得与javascript版本相同的哈希,您必须删除回车符。 你可以在PHP中这样做:

$string_to_be_hashed = preg_replace( "/\r\n/", "\n", $_POST['text'] );

然后,如果你散列$string_to_be_hashed你将得到预期的结果。

在javascript版本中,这也发生在内部。 如果检查hash256源代码 ,则有一个Utf8Encode(string)函数,其中第一行是string = string.replace(/\\r\\n/g,"\\n"); 这基本上是一样的。

我希望它是回车和换行之间的区别(\\ r \\ n vs \\ n)

您的PHP内联测试字符串可能只有\\n

网络可能有\\r\\n

其次,这些被认为是内容的一部分。 哈希它不会忽略它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM