#RSA_AES_Restful RESTful API является состоянием без состояния, поэтому для обеспечения безопасности требуется отправка аутентификационных данных при каждом запросе. Использование веб-кookies и сессий недопустимо, так как они могут быть легко скомпрометированы. Вместо этого следует использовать имя пользователя и URL запроса вместе с уникальным идентификатором (GUID), зашифрованными с использованием пароля и симметричного алгоритма шифрования.
При получении пакета сервер проверяет имя пользователя, использует пароль из базы данных для расшифровки (URL + GUID) и проверяет наличие GUID в глобальном множестве. Если GUID уже существует, то аутентификация проваливается; если нет, то GUID добавляется в множество и аутентификация проходит успешно. Если пользователь не найден или произошла ошибка при декодировании, это также считается проваленной аутентификацией.
Процесс генерации пар ключей RSA:
Генерация приватного ключа: openssl genrsa -out rsa_private_key.pem 1024
Создание открытого ключа на основе приватного ключа: openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout
Приватный ключ еще не готов к использованию и требует PKCS#8 кодировки: openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt
Процесс шифрования и дешифрования:
1. Вытягивание значений параметров mes, сортировка ключей и создание строки signdata из значений.
2. Шифрование signdata с помощью приватного ключа магазина методом RSA, создание подписи signn и преобразование ее в base64.
3. Добавление подписи signn в конец mes для создания нового сообщения data.
4. Зашифрование data AES с постоянным ключом 16 байт и преобразование его в base64.
5. Шифрование постоянного ключа 16 байт RSA с помощью публичного ключа получателя и преобразование его в base64.
6. Отправка POST запроса на URL http://xxxx/xxx/api/xxx/xxx/xxx/xxx
, содержащего merchantaccount, зашифрованного data и зашифрованного encryptkey.
7. Получение JSON ответа, который содержит зашифрованные данные и ключ.
8. Расшифровка encryptkey с помощью приватного ключа магазина методом RSA.
9. Расшифровка data AES с использованием decryptkey.
def request_process(self, mes_data):
values = {}
values['merchant_account'] = Gl.merchant_account
encrypt_key = '1234567890123456'
values['GUID'] = random(8)
data = self.aes_base64_encrypt(json.dumps(mes_data), encrypt_key)
values['data'] = data
values['encrypt_key'] = self.rsa_base64_encrypt(encrypt_password, Gl.public_key)
GUIDs = {}
def result_decrypt(self, result):
# Поиск password='1234567890123456' в базе данных
account = result['merchant_account']
with encrypt_password = db.find.where(username=account).password:
encrypt_key = self.rsa_base64_encrypt(encrypt_password, Gl.public_key)
if result['encrypt_key'] == encrypt_key:
kdata = result['data']
rdata = self.base64_aes_decrypt(kdata, encrypt_password)
print('Расшифрованные данные=' + rdata)
session_key = result['GUID'] # Предотвращение повторной отправки атаки
if GUIDs[account] != session_key:
GUIDs[account] = session_key
return self.success(json_data)
else:
return self.error()
return self.error()
Пример использования функций:
request_process_instance = RequestProcessClass()
result_decrypt_instance = ResultDecryptClass()
# Пример вызова функции request_process
request_process_instance.request_process({"example": "data"})
# Пример вызова функции result_decrypt
result_decrypt_instance.result_decrypt({"merchant_account": "example", "data": "encrypted_data", "encrypt_key": "encrypted_key"})
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )