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

Javascript Sha256与PHP Sha256:换行符创建不同的哈希?,javascript,php,hash,sha256,Javascript,Php,Hash,Sha256,当添加换行符时,我得到两个不同的哈希值 在这个站点上有一个JavaScript Sha256哈希生成器 当我在“onetwo”上运行哈希时,我得到: 当我使用PHP时 echo hash('sha256', 'onetwo'); 我得到: 25b6746d5172ed6352966a013d93ac846e1110d5a25e8f183b5931f4688842a1 21066d108d5319ecb5a1fc4454f42ef22fc5f1c7df49c31d90294950e0ea8b2

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

在这个站点上有一个JavaScript Sha256哈希生成器

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

当我使用PHP时

echo hash('sha256', 'onetwo');
我得到:

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

我得到:

25b6746d5172ed6352966a013d93ac846e1110d5a25e8f183b5931f4688842a1
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>

Sha256散列
从这里开始,在下面插入要散列的文本。


sha256:

我认为这是回车和换行之间的区别(\r\n vs\n)

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

web可能有
\r\n

第二,这些被认为是内容的一部分。散列不会忽略它。

@mrjoltcola是正确的

从文本区域获取值时,新行为\r\n(CRLF)

您可以在php代码中验证这一点,方法是打印您读取的字符串的url编码版本,如下所示:

var_dump(urlencode($_POST['text']));
$string_to_be_hashed = preg_replace( "/\r\n/", "\n", $_POST['text'] );
如果输入,将打印字符串(12)“一个%0D%0Atwo”

one
two
其中%0D是回车的html代码,%0A是换行符的html代码,如您所见

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

var_dump(urlencode($_POST['text']));
$string_to_be_hashed = preg_replace( "/\r\n/", "\n", $_POST['text'] );
然后,如果将
$string\u散列到\u be\u散列
,您将得到预期的结果


在javascript版本中,这种情况也会在内部发生。如果选中,则有一个
Utf8Encode(string)
函数,其中第一行是
string=string.replace(/\r\n/g,“\n”)
本质上是相同的。

作为旁注,您不应该在PHP中使用短标记(
),因为出于可移植性的原因,不鼓励使用短标记,请参阅@SteveWilford,注意:谢谢!!哇,回答得很好,非常深入。我给你绿色支票是因为你比Joltcola先生更深入。现在我有一个问题。因此,用\r\n替换\r\n很重要,还是javascript站点只是作为首选项来做?我想这是首选项的问题。Windows系统将新行表示为
\r\n
,而Linux将其表示为
\n
。其他系统使用前面提到的其他表示。我的意见是,如果你要散列一个文件(通过让用户上传它或其他东西),那么不要改变任何东西。否则,如果您希望创建类似于javascript站点的内容,则可以选择默认行为,但也可以提供复选框或其他内容,以允许用户选择不同的新行表示形式。谢谢您的回答。。。最后我把果岭给了埃克斯大师,因为他真的进入了深度。我也会给你投票,除非我还没有资格投票:-(