0

这就是我在java中生成hmacsha1签名的方式

private static byte[] hmac_sha1(String crypto, byte[] keyBytes, byte[] text) {
Mac hmac = null;

    try {
        hmac = Mac.getInstance(crypto);
        SecretKeySpec macKey =
            new SecretKeySpec(keyBytes, "RAW");
        hmac.init(macKey);
        System.out.println("hmac: "+Arrays.toString(keyBytes));
        return hmac.doFinal(text);
} catch (Exception e) {
    // NOTE. Deviation from reference code.
    // Reference code prints a stack trace here, which is not what we
    // want in a production environment, so instead we rethrow.
    throw new UndeclaredThrowableException(e);
    }

}

我需要帮助才能在 node.js 中生成相同的内容。有人可以帮我吗?正如人们提到的,我需要展示我在这里尝试过的是我在 node.js 中编写的代码,以创建相同的功能

Ocra.hmacSha1 = function(crypto, keyBytes, text) {
    var digest, hmac;
    hmac = nodeCrypto.createHmac(crypto, new Buffer(keyBytes, 'utf8'));
    console.log(this.bin2String(keyBytes));
    digest = hmac.update(new Buffer(text, 'utf8')).digest('hex');        
    return this.hexStr2Bytes(digest);    // here i am converting string into bytes array    
};

上面的代码没有产生预期的结果。如果我将这些参数传递给 java 代码加密:sha1 keyBytes: [ 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48 ] text:79678265454958727984804583726549455458817848560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

它们产生不同的结果,在 node.js 中产生不同的结果。

注意:在 java 中,加密是 HmacSHA1,文本是数组形式,而不是字符串形式,您也可以在代码中看到。

4

1 回答 1

0

keyBytes在 JavaScript 版本中传递了什么?new Buffer(keyBytes, 'utf8')几乎可以肯定不是你想要的。如果您要传递一个十六进制编码的字符串,则需要对其进行十六进制解码:new Buffer(keyBytes, 'hex'). 如果要传递数组,则必须执行new Buffer(keyBytes).

于 2013-06-27T06:40:03.103 回答