简体   繁体   English

有没有办法从 PHP 生成与 nodejs 相同的 Hmac hash output?

[英]Is there a way to generate same Hmac hash output from PHP as done with nodejs?

Following is my nodejs function for creating HMAC hash -以下是我的nodejs function 用于创建 HMAC hash -

function hash() {
    key = "hello";
    msg = "Hello";
    var hmac = crypto.createHmac('sha256', key);
    hmac.update(msg, 'utf8');
    var digest = hmac.digest();
    console.log('---hash =======>' + digest);
    return digest;
}

function hmacHex(key, msg) {
    var hmac = crypto.createHmac('sha256', key);
    hmac.update(msg, 'utf8');
    var digest = hmac.digest('hex');
    console.log('---hmacHex ====>' + digest);
    return digest;
}

var res = hash();
hmacHex("hello", res);

OUTPUT FROM hash() => }/�(K=�����('�Zt�h�\D�Z��@ywڦ�

OUTPUT FROM hmaxHex() => 692a18bd347476d28300e579794ba799cda80625191ef71783fce95692c2b6f9

Following is my PHP equivalent code for generating above mentioned output -以下是我的PHP等效代码,用于生成上述 output -

class Signature{

public function hash()
    {
        $key = "hello";
        $msg = "Hello";
        $hash = hash_hmac('sha256', utf8_encode($msg), $key, true);
        error_log('---hash ===>'.$hash);
        return $hash;
    }

public function hmacHex($msg)
    {
        $key = "hello";
        $hash = hash_hmac('sha256', utf8_encode($msg), $key, false);
        error_log('---hmacHex ===>' . $hash);
        return $hash;
    }
}

$obj = new Signature();

$res = $obj->hash();
$obj->hmacHex($res);
OUTPUT FROM hash() => }/?(K=?????('?Zt?h?\D?Z??@ywڦ?

OUTPUT FROM hmacHex => d920859abc579a070f2f8177e71d8431955784c8ed1d596b3364871ba35b5951

From the outputs, it is clear that in nodejs I am getting replacement characters whereas in PHP it appears as a question mark.从输出中可以清楚地看出,在 nodejs 中我得到了替换字符,而在 PHP 中它显示为问号。

I am trying to generate exactly the same output from my PHP code so that when the outputs are rehashed it should be the same.我正在尝试从我的 PHP 代码生成完全相同的 output,以便在重新散列输出时它应该是相同的。

I'll update my answer to reflect your code changes.我将更新我的答案以反映您的代码更改。 Thanks to @Topaco for resolving the issue.感谢@Topaco 解决了这个问题。

php php

class Signature {

    public function hash()
    {
        $key = "hello";
        $msg = "Hello";
        $hash = hash_hmac('sha256', $msg, $key, true);
        error_log('---hash ===>'.$hash);
        return $hash;
    }

    public function hmacHex($msg)
    {
        $key = "hello";
        $hash = hash_hmac('sha256', $msg, $key, false);
        error_log('---hmacHex ===>' . $hash);
        return $hash;
    }
}

$obj = new Signature();

$res = $obj->hash();
$obj->hmacHex($res);

node节点

class Signature {

    public function hash()
    {
        $key = "hello";
        $msg = "Hello";
        $hash = hash_hmac('sha256', $msg, $key, true);
        error_log('---hash ===>'.$hash);
        return $hash;
    }

    public function hmacHex($msg)
    {
        $key = "hello";
        $hash = hash_hmac('sha256', $msg, $key, false);
        error_log('---hmacHex ===>' . $hash);
        return $hash;
    }
}

$obj = new Signature();

$res = $obj->hash();
$obj->hmacHex($res);

php output: php output:

---hash ===>}/(K=('Zth\DZ@ywڦ
---hmacHex ===>692a18bd347476d28300e579794ba799cda80625191ef71783fce95692c2b6f9

Node.js output: Node.js output:

---hash =======>}/�(K=�����('�Zt�h�\D�Z��@ywڦ�
---hmacHex ====>692a18bd347476d28300e579794ba799cda80625191ef71783fce95692c2b6f9

your $key php side must be utf8_encode because on the node side crypto.createHmac('sha256', key);你的 $key php 端必须是 utf8_encode 因为在节点端crypto.createHmac('sha256', key);

the key here is utf8 encoded by crypto.createHmac .这里的密钥是由crypto.createHmac编码的 utf8。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM