15

Amazon Product Advertising API に接続しています。リクエストに署名するには、HMAC-SHA256 ハッシュの生のバイナリ出力を base64 エンコードする必要があります。

hash_hmacの PHP ドキュメントでは、4 番目のパラメーターbool $raw_outputは、出力が生のバイナリ データ (true) であるか、小文字の hexits (false) であるかを制御します。私のプログラムは、そのパラメーターを true に設定するだけで PHP で動作します。

ただし、これをJavascriptに移植しようとしています。CryptoJS.HmacSHA256() 関数を使用してみましたが、小文字の hexits を返すようです。これをバイナリに変換するにはどうすればよいですか?

CryptoJS のドキュメントに従って次のことを試しましたが、両方の出力は同じです。

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

5 に答える 5

20

これは、ドキュメントで説明されています。これを試して:

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/

于 2012-08-23T20:04:00.640 に答える
7

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');
于 2018-11-27T06:06:44.577 に答える
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;
};
于 2019-09-15T09:16:13.410 に答える