Convert encryption function from Javascript to Python

Question:

I’m trying to convert this code from Javascript to Python3:

import crypto from 'crypto';

const secretKey = 'NgTriSCalcUltAbLoGResOnOuSeAKeSTraLryOuR'

function verifySignature(rawBody) {
  const calculatedSignature = crypto
    .createHmac('sha256', secretKey)
    .update(rawBody, 'utf8')
    .digest('base64');

    return calculatedSignature;
}

console.log(verifySignature('a'));

With that code I get this output: vC8XBte0duRLElGZ4jCsplsbXnVTwBW4BJsUV1qgZbo=

So I’m trying to convert the same function to Python using this code:

UPDATED

import hmac
import hashlib

message = "a"
key= "NgTriSCalcUltAbLoGResOnOuSeAKeSTraLryOuR"

hmac1 = hmac.new(key=key.encode(), msg=message.encode(), digestmod=hashlib.sha256)
message_digest1 = hmac1.hexdigest()

print(message_digest1)

But I get this error: AttributeError: ‘hash’ object has no attribute ‘digest_size’

Can someone tell me what I am missing to achieve the same output in Python?

Thanks you! 🙂

Asked By: Nacho Sarmiento

||

Answers:

You’re not getting base64 from the digest() on your return statement. In your javascript code it was also encoded in UTF-8 which should be specified below. The key was also not supplied in your python code.

This code snippet I just tested should generate the same result as your javascript code:

def newhashab(msg, key):
    digest = hmac.new(key.encode('UTF-8'), msg.encode('UTF-8'), hashlib.sha256)
    return base64.b64encode(digest.digest()).decode('UTF-8')

print(newhashab("a", 'NgTriSCalcUltAbLoGResOnOuSeAKeSTraLryOuR'))

It should return:

'vC8XBte0duRLElGZ4jCsplsbXnVTwBW4BJsUV1qgZbo='
Answered By: Salad