Воссоздание CryptoJS Hmac с использованием Python - PullRequest
0 голосов
/ 23 января 2019

Сценарий состоит в том, что у меня есть сценарий JS, который создает HMAC для предоставленного пользователем ввода, и я хочу вычислить тот же HMAC для того же ввода, используя python. Чтобы прояснить ситуацию, рассмотрим следующие фрагменты кода JS и Python.

Javascript

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/hmac-sha256.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/enc-base64.min.js"></script>

<script>
    var secretAccessKey = "bAvW5O18eSrxke4I7eFcrnrDJkN+wKQmx9aSHuMZQ0w=";
    var stringtoSign = "Test";

    // Generate HMAC SHA256 signature
    var secretAccessKeyBase64 = CryptoJS.enc.Base64.parse(secretAccessKey);
    var hash = CryptoJS.HmacSHA256(stringtoSign, secretAccessKeyBase64);
    var signature = CryptoJS.enc.Base64.stringify(hash);
</script>

Python

stringToSign = "Test"
secretAccessKey = "bAvW5O18eSrxke4I7eFcrnrDJkN+wKQmx9aSHuMZQ0w="

secretAccessKeyBase64 = base64.b64decode(secretAccessKey).hex()
keyBytes = bytes(secretAccessKeyBase64, 'utf-8')
stringToSignBytes = bytes(stringToSign, 'utf-8')
signatureHash = hmac.new(keyBytes, stringToSignBytes, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(signatureHash)
print(signature)

Код Javascript дает мне b + 1wRzDODA85vyDZkXByPIKO5qmnjCRNF5gZFi33 / Ic = , в то время как python дает мне значение b'SsZ4bcYe3op1nGU6bySzlSc9k6 * * ss37qzs1515g * zs15pg Почему мой код на python генерирует другой HMAC для (казалось бы) идентичных входных данных, которые были предоставлены в сценарий JS? Есть ли способ получить значение HMAC, выведенное кодом JS с использованием python?

1 Ответ

0 голосов
/ 23 января 2019

Вы используете закодированное в Base64 значение в качестве секрета в Javascript, тогда как в Python вы используете простой текстовый секрет.

<script>
    var secretAccessKeyBase64 = "secret";
    var hash = CryptoJS.HmacSHA256("Message", secretAccessKeyBase64);
    var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
    document.write(hashInBase64);
</script>

Это выводит то же значение, что и код Python:

qnR8UCqJggD55PohusaBNviGoOJ67HC6Btry4qXLVZc=

Редактировать:

base64 возвращает байтовый объект, нет необходимости преобразовывать его в hex():

stringToSign = "Test"
secretAccessKey = "bAvW5O18eSrxke4I7eFcrnrDJkN+wKQmx9aSHuMZQ0w="

secretAccessKeyBase64 = base64.b64decode(secretAccessKey)
keyBytes = secretAccessKeyBase64
stringToSignBytes = bytes(stringToSign, 'utf-8')

signatureHash = hmac.new(keyBytes, stringToSignBytes, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(signatureHash)
print(signature)

Печатает правильно:

b'b+1wRzDODA85vyDZkXByPIKO5qmnjCRNF5gZFi33/Ic='
...