Узел & python не возвращает тот же хэш256 - PullRequest
5 голосов
/ 03 марта 2020

Мои NodeJS & Python скрипты не возвращают тот же ха sh, что может вызвать эту проблему?

Node.js

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

Python3

message = 'v1:1583197109:'
key = 'Asjei8578FHasdjF85Hfjkasi875AsjdiAas_CwueKL=' + '=' #add a "=" to avoid incorrect padding
digest = base64.b64decode(key.encode('utf-8'))
hash_ = hmac.new(digest, message.encode('utf-8'), hashlib.sha256)
hash_result = hash_.hexdigest()
print(hash_result)
> c762b612d7c56d3f9c95052181969b42c604c2d41b7ce5fc7f5a06457e312d5b

Я думаю, это может быть дополнительный = , чтобы избежать неправильного заполнения, но моя клавиша заканчивается одним = .

1 Ответ

3 голосов
/ 03 марта 2020

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, который будет проверять входную строку и "провалиться вслух" вместо игнорирования неправильных символов

...