2013-06-16 4 views
2

je peux obtenir un HMAC chanter en utilisant Python comme suit:comment obtenir le code HMAC avec javascript

import hmac, base64, hashlib 

def make_sign(): 
    hash_data = "data" 
    secret = "this is secret" 
    sha512 = hashlib.sha512 
    hmac_obj = hmac.new(secret, hash_data, sha512) 
    str_hash = hmac_obj.digest() 
    sign = base64.b64encode(str_hash) 
    hex_hash = hmac_obj.hexdigest() 
    hex_sign = base64.b64encode(hex_hash) 
    print "correct_sign:",sign 
    print "hex_digest_sign:",hex_sign 
make_sign() 

sortie:

correct_sign: Lg4pXNCIpitNQt2DLU19qWb+FxdsYZlK4LLncfkTzSidrYoFJLNolUziRqh09B5HyRdCTEP7enZp6/Te34FK1g== 
hex_digest_sign: MmUwZTI5NWNkMDg4YTYyYjRkNDJkZDgzMmQ0ZDdkYTk2NmZlMTcxNzZjNjE5OTRhZTBiMmU3NzFmOTEzY2QyODlkYWQ4YTA1MjRiMzY4OTU0Y2UyNDZhODc0ZjQxZTQ3YzkxNzQyNGM0M2ZiN2E3NjY5ZWJmNGRlZGY4MTRhZDY= 

mais avec js, je peux obtenir hex_digest_sign, mais je dois get correct_sign pour la requête web.

function make_request() { 
    hash_data = "data" 
    secret = "this is secret" 
    hmac = hmac_512(hash_data, secret) 
    var sign = $.base64.encode(hmac), 
    console.log("js_sign="+sign); 
} 

function hmac_512(message, secret) { 
    var hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA512, secret); 
    hmac.update(message); 
    var hash = hmac.finalize(); 
    return hash; 
} 

de sortie:

js_sign="MmUwZTI5NWNkMDg4YTYyYjRkNDJkZDgzMmQ0ZDdkYTk2NmZlMTcxNzZjNjE5OTRhZTBiMmU3NzFmOTEzY2QyODlkYWQ4YTA1MjRiMzY4OTU0Y2UyNDZhODc0ZjQxZTQ3YzkxNzQyNGM0M2ZiN2E3NjY5ZWJmNGRlZGY4MTRhZDY=" 

le signe correct est

correct_sign: Lg4pXNCIpitNQt2DLU19qWb+FxdsYZlK4LLncfkTzSidrYoFJLNolUziRqh09B5HyRdCTEP7enZp6/Te34FK1g==

comment obtenir dans js?

Répondre

0

Je suppose que vous avez des problèmes avec les types et le codage. Selon le CryptoJS source, le style de hachage itératif que vous utilisez renvoie un WordArray une fois que vous appelez finalize().

Avec cela, une fois que vous allez imprimer les résultats, vous imprimez le contenu de WordArray.

Le hachage itératif a généralement pour but de réduire les hachages en blocs pour travailler sur une seule pièce à la fois. Essayez l'édition ci-dessous que j'ai faite qui supprime cela car il ne semble pas que vous deviez itérer.

function hmac_512(message, secret) { 
var newHMAC = CryptoJS.HmacSHA256(message, secret); 
    return newHMAC; 
} 

Le retournera simplement au-dessus du HMAC sous forme de chaîne qui, une fois base64 codé, doit correspondre au résultat que vous voyez en Python. Pour un exemple pratique, vous pouvez consulter mon service de cryptage de lecteur Google qui utilise cryptoJS HMAC. http://meowcrypt.com/

Espérons que cela aide!