我正在尝试将此代码从Javascript转换为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'));
通过这段代码,我得到了这样的输出:vC8XBte0duRLElGZ4jCsplsbXnVTwBW4BJsUV1qgZbo=
所以我试图使用以下代码将相同的函数转换为Python:
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)
但是我得到这个错误:AttributeError: 'hash'对象没有属性'digestrongize'
有人能告诉我我错过了什么在Python中实现相同的输出?
谢谢你!:)
您没有从返回语句的digest()中获得base64。在你的javascript代码中,它也是用UTF-8编码的,应该在下面指定。python代码中也没有提供该键。
我刚刚测试的代码片段应该会生成与javascript代码相同的结果:
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'))
它应该返回:
'vC8XBte0duRLElGZ4jCsplsbXnVTwBW4BJsUV1qgZbo='