Node.js Buffer.from(..., 'base64')
может потреблять ввод в "urlsafe" base64 (https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings), а _
не является допустимым символом Base64 для python, в то время как он для узел.
Добавление altchars
, которое соответствует "Basel-Safe" версии Base64, к python коду дает равные хэши.
const { createHmac } = require("crypto");
var message = 'v1:1583197109:'
var key = 'Asjei8578FHasdjF85Hfjkasi875AsjdiAas_CwueKL='
const digest = Buffer.from(key, "base64");
const hash = createHmac("sha256", digest)
.update(message)
.digest("hex");
console.log(hash) // 7655b4f816dc7725fb4507a20f2b97823979ea00b121c84b76924fea167dcaf7
message = 'v1:1583197109:'
key = 'Asjei8578FHasdjF85Hfjkasi875AsjdiAas_CwueKL=' + '=' #add a "=" to avoid incorrect padding
digest = base64.b64decode(key.encode('utf-8'), altchars='-_')
hash_ = hmac.new(digest, message.encode('utf-8'), hashlib.sha256)
hash_result = hash_.hexdigest()
print(hash_result) # 7655b4f816dc7725fb4507a20f2b97823979ea00b121c84b76924fea167dcaf7
Также python s b64decode
имеет validate
kwarg, который будет проверять входную строку и "провалиться вслух" вместо игнорирования неправильных символов