Search code examples
javascriptpythonnode.jshashhashlib

jsSHA and Python hashlib give different results for same input


The following snippets use Nodejs and Python to calculate a hash from the same input content, but they give different results. It's weird.

// npm install jssha
const jssha = require("jssha");
var s = new jssha("SHA-1", "TEXT");
s.setHMACKey("abc", "TEXT")
s.update("123")
console.log(s.getHMAC("B64"))

The result is vpEGplDt4B9KMf3iOB0G9ftz5hI=

import hmac
import hashlib
import base64

hashed = hmac.new(b"abc", b"TEXT", hashlib.sha1)
hashed.update("123".encode('utf-8'))
print(base64.b64encode(hashed.digest()).decode())

The result is f1/O4xLhhZgwtm6IMAwLDmjzQgg=


Solution

  • this will get the same hmac as javascript:

    import hmac
    import hashlib
    import base64
    
    hashed = hmac.new(key=b"abc", msg=b"", digestmod=hashlib.sha1)
    hashed.update("123".encode('utf-8'))
    print(base64.b64encode(hashed.digest()).decode())
    # vpEGplDt4B9KMf3iOB0G9ftz5hI=
    

    i do not know anything about this javascript api, but i guess "TEXT" tells javascript how the data/key is encoded.