Создание цифровой подписи для API-запросов в bash

Вопрос или проблема

У меня есть скрипт на 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

  1. Чтение закрытого ключа:
    Откройте файл с закрытым ключом и сохраните его содержимое в переменную.

  2. Создание хеша:
    Используйте OpenSSL для генерации SHA-256 хеша сообщения.

  3. Подпись сообщения:
    Используйте OpenSSL для подписи хеша с помощью закрытого ключа.

  4. Кодирование в 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"

Пояснения:

  1. Чтение закрытого ключа: С помощью OpenSSL мы можем загружать закрытые ключи с фразой. Если фраза отсутствует, она просто загружается.

  2. Генерация SHA-256 хеша: openssl dgst -sha256 -binary создает бинарный хеш, что соответствует вызову SHA256.new() в Python.

  3. Подпись хеша: openssl rsautl -sign подписывает хеш, используя закрытый ключ.

  4. Кодирование: base64 преобразует бинарную подпись в строку, готовую для передачи.

Заключение

Этот скрипт на Bash позволит вам генерировать цифровую подпись, аналогичную той, что создается в Python с использованием Crypto.Signature. Убедитесь, что у вас установлены все необходимые инструменты (openssl, base64) и правильно настроены пути к файлам. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...