Javascript Sha256与PHP Sha256:换行符创建不同的哈希?
当添加换行符时,我得到两个不同的哈希值 在这个站点上有一个JavaScript Sha256哈希生成器 当我在“onetwo”上运行哈希时,我得到: 当我使用PHP时Javascript Sha256与PHP Sha256:换行符创建不同的哈希?,javascript,php,hash,sha256,Javascript,Php,Hash,Sha256,当添加换行符时,我得到两个不同的哈希值 在这个站点上有一个JavaScript Sha256哈希生成器 当我在“onetwo”上运行哈希时,我得到: 当我使用PHP时 echo hash('sha256', 'onetwo'); 我得到: 25b6746d5172ed6352966a013d93ac846e1110d5a25e8f183b5931f4688842a1 21066d108d5319ecb5a1fc4454f42ef22fc5f1c7df49c31d90294950e0ea8b2
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: <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站点的内容,则可以选择默认行为,但也可以提供复选框或其他内容,以允许用户选择不同的新行表示形式。谢谢您的回答。。。最后我把果岭给了埃克斯大师,因为他真的进入了深度。我也会给你投票,除非我还没有资格投票:-(