二进制的 php 哈希是如何工作的

问题描述

PHP 教程,有这个

hash ( string $algo,string $data,bool $binary = false )

我使用其他语言并进行哈希并获得结果,如果我不使用哈希 bool 作为 binary = true,如果哈希 binary = true,则结果不匹配。这是我对我正在做的事情的尝试 例子在这里

PHP 版本

var_dump(hash('sha256','1612466079678052nonce=1612466079678052',false)); 

CF 版本

lcase(hash('1612466079678052nonce=1612466079678052',"SHA-256","UTF-8"));

产生这个结果 PHP 和 CF 的结果

c0363f560d8df85b1f24d3f88e6f32a78370f55b0501a5b0c6d18d0009de2460 

现在我将设置 PHP 哈希的布尔值为 true

PHP 版本:

var_dump(hash('sha256',true)); 

PHP 的结果

�6?V ��[$���o2��p�[���э �$` 

现在Coldfusion

dump(toString(binaryDecode(lcase(hash('1612466079678052nonce=1612466079678052',"UTF-8")),"base64"))); 

CF 的结果

sM���z���[���ww����f��~��[ӝ5k��s�u��4��^ێ�

任何人都可以在这里发现问题我做错了什么来获得像 PHP 一样的确切结果

解决方法

首先:您试图将原始 BINARY 值输出为 STRINGS(可打印字符)。如果您想将原始 BINARY 数据输出为 STRING,我建议使用适当的编码来做到这一点(两种语言)。只是打印/回显/输出原始 BINARY 数据总是会导致许多未映射的字符或未识别的 UTF-8 字符“�”。因此数据不是可读的可打印字符。

第二: 使用 PHP 中的函数:

hash('sha256','1612466079678052nonce=1612466079678052',false); 

在 CFML 中:

hash('1612466079678052nonce=1612466079678052',"SHA-256");

是相同的,因为两者都输出/回显二进制 HASH 的 STRING 表示为 HEX(十六进制数据):

c0363f560d8df85b1f24d3f88e6f32a78370f55b0501a5b0c6d18d0009de2460

相同数据的原始 BINARY 格式将是(这里的数据是 0 和 1 的字符串表示):

1100000000110110001111110101011000001101100011011111100001011011000111110010010011010011111110001000111001101111001100101010011110000011011100001111010101011011000001010000000110100101101100001100011011010001100011010000000000001001110111100010010001100000  

如果您将 PHP 哈希函数的“设置为二进制”标志设置为“真”,您将把上述二进制数据以明文形式输出到输出流,而在 CFML 中,您将尝试“base64”解码十六进制字符串以获取原始二进制数据。这种假设是错误的。您需要做的是首先将 HASH 转换为二进制解码,从 HEX 到二进制:

binaryDecode(hash("1612466079678052nonce=1612466079678052","SHA-256"),"hex");

如果您使用 cfdump 的 Adob​​e 或 Lucee 的 CFML 将 HASH 输出为二进制:

<cfscript>
    dump(binaryDecode(hash("1612466079678052nonce=1612466079678052","hex"));
</cfscript>

,引擎会根据自己的假设尝试将原始二进制数据转换为 STRING 表示。在 Lucee 中,您将看到相同二进制数据的 base64 表示。

enter image description here

因为您的 PHP var_dump 函数是将相同的原始二进制数据直接输出到输出流,所以您只需要在 CFML 中写入该二进制数据:

<cfscript>
writeoutput(binaryDecode(hash("1612466079678052nonce=1612466079678052","hex"));
</cfscript>

什么会产生相同的结果:

�6?V ��[$���o2��p�[���э �$`