NodeJS如何能够对Buffer进行哈希处理?

时间:2018-09-05 10:08:21

标签: php node.js

我有一个现有的NodeJS库,我试图在PHP中匹配其哈希的Buffer功能(特别是下面的“ AFTER”值),但到目前为止失败了。 NodeJS在内部对缓冲区做些什么,以便可以对其进行哈希处理并作为新的缓冲区返回?

...
let concatValue = isHex(currentbranchOps[o].r) ? Buffer.from(currentbranchOps[o].r, 'hex') : Buffer.from(currentbranchOps[o].r, 'utf8')
currentHashValue = Buffer.concat([currentHashValue, concatValue])

console.log('BEFORE: ', currentHashValue); // Uint8Array(76) [110, 111, 100, 101......]
currentHashValue = crypto.createHash('sha256').update(currentHashValue).digest()
console.log('AFTER: ', currentHashValue); // Uint8Array(32) [123, 67, 203, 88......]
...

鉴于只能对字符串类型进行哈希处理,Node如何以另一个Buffer的形式到达上面的“ AFTER”值?

在PHP中,我尝试过:

hash('sha256', pack('H*', implode('', [110, 111, 100, 101......] )))
hash('sha256', pack('c*', implode('', [110, 111, 100, 101......] )))

我还编写了一个例程,该例程将字符串的摘要作为字符串提供给我,然后对结果(及其各种排列)进行散列,而无法完全匹配Node在“ AFTER”块中给我的内容。 / p>

function buffer_digest_from(array $dec) : string
{
    $hex = '';

    foreach($dec as $int) {
        // Left pad single hex values with zeroes, to match chainpoint hashes
        $hex .= str_pad(dechex($int), 2, '0', STR_PAD_LEFT);
    }

    return $hex;
}

hash('sha256', pack('H*', buffer_digest_from([110, 111, 100, 101......] )));
hash('sha256', pack('c*', buffer_digest_from([110, 111, 100, 101......] )));
hash('sha256', buffer_digest_from([110, 111, 100, 101......] ));

我当然意识到语言在实现上会有所不同,但是如果我只想操作整数,那么无论实现如何,都应该有某种方法可以达到相同的解决方案。

非常感谢您阅读。

1 个答案:

答案 0 :(得分:2)

我认为这个问题可能源于对Node.js缓冲区的误解。它们实际上只是一个字节序列。在控制台中输出它们并与之交互的默认方式看起来像是一个数字数组。

PHP也具有类似的数据类型,该数据类型存储字节列表,但是它的接口看起来不太像数组。实际上是谦虚的string

PHP的字符串不同于Javascript的字符串。 Javascript的字符串更像是“一系列字符”,但是PHP的字符串只是字节列表。

因此,如果您有一个(PHP)数组,例如:

$input = [110, 111, 100, 101.....];

要将其转换为字符串,您实际上只需执行以下操作:

$buffer = '';
foreach($input as $byte) {
  $buffer .= chr($byte);
}

之所以存在Node.js缓冲区,是因为Javascript最初没有“字节系列”数据结构,并且您不能真正使用javascript的字符串存储任何字节列表。

因此,即使它们的接口不同,以下三种数据类型还是差不多的:

  • PHP的string
  • Node.js'Buffer
  • C的char数组(没有本地C字符串类型)

PHP的数据结构类似于PHP 6中的Javascript字符串,但是PHP 6是固定的。