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 的包含换行符 (return) 的散列时,例如:
'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: <b><?= hash('sha256',$_POST['text']); ?></b><br />
</div>
<? endif; ?>
</body>
</html>
我希望这是回车 return 和换行符之间的区别( \r\n 与 \n )
您的 PHP 内联测试字符串可能只有 \n
网页版大概有\r\n
其次,这些都算是内容的一部分。散列它不会忽略它。
@mrjoltcola 是对的。
从文本区域获取值时,新行是 \r\n (CRLF)。
您可以在 php 代码中通过打印您读取的字符串的 url 编码版本来验证这一点:
var_dump(urlencode($_POST['text']));
如果您输入
,这将打印 string(12) "one%0D%0Atwo"
one
two
其中 %0D 是 html 回车代码 return 和 %0A 换行代码,如您所见 here.
现在要获得与 javascript version 中相同的散列,您必须删除回车 return。你可以在 php 中这样做:
$string_to_be_hashed = preg_replace( "/\r\n/", "\n", $_POST['text'] );
然后,如果您对 $string_to_be_hashed
进行哈希处理,您将得到预期的结果。
在 javascript 版本中,这也在内部发生。如果您检查 hash256 source code,则有一个 Utf8Encode(string)
函数,其中第一行是 string = string.replace(/\r\n/g,"\n");
,本质上是相同的。
添加换行符后我得到两个不同的哈希值。
在此站点 http://www.xorbin.com/tools/sha256-hash-calculator 上有一个 JavaScript Sha256 哈希生成器。
当我 运行 在 "onetwo" 上进行哈希时,我得到:
25b6746d5172ed6352966a013d93ac846e1110d5a25e8f183b5931f4688842a1
当我使用PHP
echo hash('sha256', 'onetwo');
我得到:
25b6746d5172ed6352966a013d93ac846e1110d5a25e8f183b5931f4688842a1
但是当我 运行 来自 URL 的包含换行符 (return) 的散列时,例如:
'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: <b><?= hash('sha256',$_POST['text']); ?></b><br />
</div>
<? endif; ?>
</body>
</html>
我希望这是回车 return 和换行符之间的区别( \r\n 与 \n )
您的 PHP 内联测试字符串可能只有 \n
网页版大概有\r\n
其次,这些都算是内容的一部分。散列它不会忽略它。
@mrjoltcola 是对的。
从文本区域获取值时,新行是 \r\n (CRLF)。
您可以在 php 代码中通过打印您读取的字符串的 url 编码版本来验证这一点:
var_dump(urlencode($_POST['text']));
如果您输入
,这将打印string(12) "one%0D%0Atwo"
one
two
其中 %0D 是 html 回车代码 return 和 %0A 换行代码,如您所见 here.
现在要获得与 javascript version 中相同的散列,您必须删除回车 return。你可以在 php 中这样做:
$string_to_be_hashed = preg_replace( "/\r\n/", "\n", $_POST['text'] );
然后,如果您对 $string_to_be_hashed
进行哈希处理,您将得到预期的结果。
在 javascript 版本中,这也在内部发生。如果您检查 hash256 source code,则有一个 Utf8Encode(string)
函数,其中第一行是 string = string.replace(/\r\n/g,"\n");
,本质上是相同的。