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

keyBytesJavaScriptバージョンでは何を渡していますか? new Buffer(keyBytes, 'utf8')ほぼ確実にあなたが望むものではありません。16 進数でエンコードされた文字列を渡す場合は、16 進数でデコードする必要があります: new Buffer(keyBytes, 'hex'). 配列を渡す場合は、する必要がありますnew Buffer(keyBytes)

于 2013-06-27T06:40:03.103 に答える