Шифрование данных
В API используется шифрование для защиты передаваемых данных. Основной алгоритм шифрования — RSA. Для успешной интеграции необходимо получить открытый ключ шифрования от поставщика API.
Описание алгоритма шифрования
- Алгоритм: RSA
- Используемый ключ: Открытый ключ, предоставляемый при заключении договора.
- Формат данных: Шифруются только те параметры, которые указаны в описании методов.
- Формат передачи данных:
- Зашифрованные данные помещаются в тело запроса или передаются в формате Query Parameters.
- Нешифрованные данные передаются в формате JSON.
Процесс шифрования
- Параметры, подлежащие шифрованию, преобразуются в строку.
- Строка шифруется с использованием предоставленного открытого ключа RSA.
- Результат шифрования отправляется в запросе.
Пример реализации шифрования на 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"указывает на отсутствие шифрования.
Примечания
- Проверка IP-адреса:
Перед началом работы убедитесь, что ваш IP-адрес добавлен в список доверенных у поставщика API. Это обязательное условие для успешной интеграции.