2013-06-26 4 views
0

То есть, как я генерации hmacsha1 подписи в JavaСоздать подпись hmacSha1 в node.js, такую ​​же, как java?

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-код crypto: sha1 keyBytes: [49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48] текст: 79678265454958727984804583726549455458817848560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

они производят различный результат, и в node.js он производит различные результаты.

Примечание: В java crypto есть HmacSHA1, а текст в виде массива не является строковым, как вы можете видеть в коде.

+1

См. Документы, это легко: http://nodejs.org/api/crypto.html#crypto_crypto_createhmac_algorithm_key – gustavohenke

+0

Не самый лучший вопрос, не показывая, что было опробовано, но это определенно не «вне темы». –

+0

@owlstead В то время, когда я голосовал, чтобы закрыть его ***, *** был отключен от темы, не сумев «продемонстрировать минимальное понимание решаемой проблемы», в том числе никаких доказательств того, что было опробовано. Это изменилось из-за последнего изменения. Я голосую честно, но рано, из-за множества вопросов, которые никогда не улучшаются. –

ответ

0

Что вы передаете как keyBytes в версии JavaScript? new Buffer(keyBytes, 'utf8') почти наверняка не то, что вы хотите. Если вы передаете шестнадцатеричную кодированную строку, вам необходимо выполнить ее декодирование: new Buffer(keyBytes, 'hex'). Если вы передаете массив, вы должны сделать new Buffer(keyBytes).

+0

Я передаю массив [49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48] в качестве ключевых бит. Что представляет собой шестнадцатеричное представление OCRA-1: HOTP-SHA1-6: QN08 –

+0

В этом случае, согласно документации, 'новый буфер (keyBytes)' должен делать трюк. – ntoskrnl

+0

Если я попробую решение, упомянутое выше, hmac = nodeCrypto.createHmac (крипто, новый буфер (keyBytes)); console.log (новый буфер (keyBytes)); Я получаю пустой hmac. –