Вопрос или проблема
У меня есть скрипт на Python для создания подписи/токена для API-запросов. Он работает нормально. Я переписал почти все строки с Python на Bash. Теперь я не могу декодировать/перевести следующие строки с Python на Bash, чтобы создать правильную подпись и завершить мой Bash-скрипт.
from Crypto.PublicKey import RSA
from Crypto.Signature import pss
from Crypto.Hash import SHA256
# Загрузка закрытого ключа
try:
with open(private_key_location, 'r') as file:
# Чтение содержимого файла
private_key_string = file.read()
# Загрузка закрытого ключа
private_key = RSA.import_key(
private_key_string, passphrase=passphrase if passphrase else None)
# Подпись
h = SHA256.new(signing_string.encode('utf-8'))
signature = pss.new(private_key).sign(h)
# Кодирование
encoded_signature = base64encode(signature)
Первая проблема, с которой я столкнулся, это строка signing_string.encode('utf-8')
, так как в Python она создаст байтовую строку b'
. Я пробовал iconv
в Bash для байтовой строки, но это, похоже, не решает задачу. Возможно, я ошибаюсь.
Во-вторых, я попробовал подписать и все остальное с помощью следующей команды в Bash.
echo -n $MESSAGE | openssl dgst -sha256 -hmac $SECRET -binary | base64
эта команда выводит некоторое количество символов, в то время как результат Python-версии дает много символов, обернутых в несколько строк. Я тоже пробовал следующее:
echo $MESSAGE | openssl dgst -sha256 -sign private.pem | base64
это дает много символов, обернутых в несколько строк, как в версии Python, но не генерирует правильную подпись для авторизации сервера, так что проблема в логике.
Нужна помощь в переводе кода Python выше на Bash, чтобы сгенерировать подпись.
Я знаю, что могу использовать весь этот код в Bash, используя команду python -c ""
и так далее, но моя цель – чистый Bash-скрипт.
Ответ или решение
Для создания цифровой подписи для API-запросов в Bash, основываясь на вашем Python-коде, понадобится использование утилиты openssl
, так как она позволяет работать с RSA и SHA256. Вы можете следовать этому пошаговому руководству для выполнения перевода из Python в Bash.
Задача
Перевести следующий код на Python в Bash:
from Crypto.PublicKey import RSA
from Crypto.Signature import pss
from Crypto.Hash import SHA256
# Загрузка приватного ключа
try:
with open(private_key_location, 'r') as file:
private_key_string = file.read()
private_key = RSA.import_key(private_key_string, passphrase=passphrase if passphrase else None)
# Подпись
h = SHA256.new(signing_string.encode('utf-8'))
signature = pss.new(private_key).sign(h)
# Кодирование
encoded_signature = base64encode(signature)
Шаги для конвертации в Bash
-
Чтение закрытого ключа:
Откройте файл с закрытым ключом и сохраните его содержимое в переменную. -
Создание хеша:
Используйте OpenSSL для генерации SHA-256 хеша сообщения. -
Подпись сообщения:
Используйте OpenSSL для подписи хеша с помощью закрытого ключа. -
Кодирование в base64:
Используйте командуbase64
для кодирования полученной подписи.
Пример кода на Bash
Вот пример скрипта Bash, который выполняет все описанные шаги:
#!/bin/bash
# Параметры
private_key_location="path/to/private.pem" # Укажите путь к вашему приватному ключу
signing_string="ваша строка для подписи" # Замените на строку, которую нужно подписать
passphrase="ваша_фраза" # Укажите вашу фразу (если есть)
# Чтение закрытого ключа
if [[ -n "$passphrase" ]]; then
private_key=$(openssl rsa -in "$private_key_location" -passin pass:"$passphrase" -outform PEM)
else
private_key=$(cat "$private_key_location")
fi
# Генерация SHA-256 хеша
hash=$(echo -n "$signing_string" | openssl dgst -sha256 -binary)
# Подпись хеша
signature=$(echo -n "$hash" | openssl rsautl -sign -inkey <(echo "$private_key"))
# Кодирование в base64
encoded_signature=$(echo -n "$signature" | base64)
# Вывод подписи
echo "$encoded_signature"
Пояснения:
-
Чтение закрытого ключа: С помощью OpenSSL мы можем загружать закрытые ключи с фразой. Если фраза отсутствует, она просто загружается.
-
Генерация SHA-256 хеша:
openssl dgst -sha256 -binary
создает бинарный хеш, что соответствует вызовуSHA256.new()
в Python. -
Подпись хеша:
openssl rsautl -sign
подписывает хеш, используя закрытый ключ. -
Кодирование:
base64
преобразует бинарную подпись в строку, готовую для передачи.
Заключение
Этот скрипт на Bash позволит вам генерировать цифровую подпись, аналогичную той, что создается в Python с использованием Crypto.Signature
. Убедитесь, что у вас установлены все необходимые инструменты (openssl
, base64
) и правильно настроены пути к файлам. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться!