Javascript:PHP的hash_hmac()与RAW BINARY输出的等价物?

时间:2012-08-23 19:59:54

标签: php javascript binary base64 amazon-product-api

我正在连接到亚马逊产品广告API,要签署我的请求,我需要对HMAC-SHA256哈希的原始二进制输出进行base64编码。

the PHP documentation for hash_hmac中,第四个参数bool $raw_output控制输出是原始二进制数据(true)还是小写hexits(false)。我的程序只需将该参数设置为true即可在PHP中运行。

但是,我现在正尝试将此移植到Javascript。我尝试使用CryptoJS.HmacSHA256()函数,但它似乎返回小写的六角形。如何将其转换为二进制文件?

我根据CryptoJS文档尝试了以下内容,但两个输出完全相同:

var hash = CryptoJS.HmacSHA256("hello", "key");
console.log(hash.toString());
console.log(hash.toString(CryptoJS.enc.Base64));

5 个答案:

答案 0 :(得分:12)

这在他们的documentation中有解释。试试这个:

var hash = CryptoJS.HmacSHA256("Message", "Secret Passphrase");

var base64 = hash.toString(CryptoJS.enc.Base64);

您需要包含http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/enc-base64-min.js。如果您不包含此内容,则CryptoJS.enc.Base64将为undefined并回退到默认值。

工作演示:http://jsfiddle.net/ak5Qm/

答案 1 :(得分:3)

php code

// UnityEngine.Camera cam1;
// UnityEngine.Camera cam2;

void Update()
{
    bool isVisibleForCamera1 = cam1.IsObjectVisible(GetComponent<MeshRenderer>());
    bool isVisibleForCamera2 = cam2.IsObjectVisible(GetCoponent<SpriteRenderer>());
}

php输出

echo base64_encode(hash_hmac('SHA1', 'shanghai', '0', true).'beijing');

节点代码

xvBv49PpaYvXAIfy3iOSDWNQj89iZWlqaW5n

节点输出

var crypto = require('crypto');
var buf1 = crypto.createHmac("sha1", "0").update("shanghai").digest();
var buf2 = Buffer.from('beijing');
console.log(Buffer.concat([buf1, buf2]).toString('base64'));    

答案 2 :(得分:1)

PHP:

base64_encode(hash_hmac('sha256', $value, $key, true));

相当于Nodejs:

const crypto = require('crypto');
let token = crypto.createHmac("sha256", key).update(value).digest().toString('base64');

答案 3 :(得分:0)

您还可以使用此npm软件包在Javascript中执行相同的操作。

var jsSHA = require('jssha');

hmac_sha1(string, key){
    let shaObj = new jsSHA("SHA-1", "TEXT");
    shaObj.setHMACKey(key, "TEXT");
    shaObj.update(string);
    let hmac = shaObj.getHMAC("B64");
    return hmac;
};

答案 4 :(得分:0)

这对我有用:

var CryptoJS = require("crypto-js");
const raw_signature = hmacSHA1(baseString, signingKey);
const signature = raw_signature.toString(CryptoJS.enc.Base64);

与PHP中的结果完全相同:

$rawSignature = hash_hmac("sha1", $baseString, $signingKey, true);
$signature    = base64_encode($rawSignature);