Skip to content

Шифрование данных

В API используется шифрование для защиты передаваемых данных. Основной алгоритм шифрования — RSA. Для успешной интеграции необходимо получить открытый ключ шифрования от поставщика API.


Описание алгоритма шифрования

  • Алгоритм: RSA
  • Используемый ключ: Открытый ключ, предоставляемый при заключении договора.
  • Формат данных: Шифруются только те параметры, которые указаны в описании методов.
  • Формат передачи данных:
  • Зашифрованные данные помещаются в тело запроса или передаются в формате Query Parameters.
  • Нешифрованные данные передаются в формате JSON.

Процесс шифрования

  1. Параметры, подлежащие шифрованию, преобразуются в строку.
  2. Строка шифруется с использованием предоставленного открытого ключа RSA.
  3. Результат шифрования отправляется в запросе.

Пример реализации шифрования на PHP

<?php
function encryptData($data) {
    // Путь к открытому ключу
    $path_to_cert = 'cert.pem';
    $publicCert = file_get_contents($path_to_cert);

    // Шифрование данных
    openssl_public_encrypt($data, $encryptedData, $publicCert);
    return $encryptedData;
}
// Пример использования
$data = "some_unique_password";
$encryptedPassword = encryptData($data);
echo $encryptedPassword;
?>

Пример запроса с использованием шифрования

POST https://api-pvk.prostodar.ru/partner/get_balance/ Тело запроса

{
  "partnerName": "mts",
  "partnerPassword": "encrypted_password",
  "useAuthByCert": "Y"
}

Пример реализации шифрования и отправки запроса на Python

import pycurl
from io import BytesIO
from urllib.parse import urlencode
import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend
from cryptography import x509


def encrypt_data(data):
    # Считываем открытый ключ из файла cert.pem
    with open('cert.pem', 'rb') as cert_file:
        cert_data = cert_file.read()
    cert = x509.load_pem_x509_certificate(cert_data, default_backend())
    public_key = cert.public_key().public_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PublicFormat.SubjectPublicKeyInfo
    )
    rsa_pub_key = rsa.PublicKey.load_pkcs1_openssl_pem(public_key)
    # Шифруем данные (строку нужно кодировать в байты)
    encrypted = rsa.encrypt(
        data.encode('utf-8'),
        rsa_pub_key
    )
    return encrypted

def get_balance():
    #формируем словарь с данными, для параметров подлежащих шифрованию вызываем функцию "encrypt_data"
    data = {
        'partnerName': 'partnerName',
        'partnerPassword': encrypt_data('partnerName'),
        'useAuthByCert':'Y'
    }
    # #формируем запрос
    postfields = urlencode(data)
    buffer = BytesIO()
    c = pycurl.Curl()
    c.setopt(c.URL, 'https://api-pvk.prostodar.ru/partner/balance/')
    c.setopt(c.WRITEDATA, buffer)
    c.setopt(c.POSTFIELDS, postfields)
    c.setopt(pycurl.SSL_VERIFYPEER, 0)
    c.setopt(pycurl.SSL_VERIFYHOST, 0)
    c.perform()
    #получаем код состояния
    status_code = c.getinfo(pycurl.RESPONSE_CODE)
    c.close()
    #получаем ответ
    response = buffer.getvalue().decode('utf-8')

Дополнительные пояснения

  • partnerPassword: Данный параметр должен быть зашифрован перед отправкой запроса. Используйте предоставленный открытый ключ для шифрования.
  • useAuthByCert: Параметр, который указывает на использование шифрования.
  • Значение "Y" означает, что шифрование включено.
  • Значение "N" указывает на отсутствие шифрования.

Примечания

  1. Проверка IP-адреса:
    Перед началом работы убедитесь, что ваш IP-адрес добавлен в список доверенных у поставщика API. Это обязательное условие для успешной интеграции.