как зашифровать и расшифровать данные между приложением angular и приложением django

#encryption #cryptojs #pycrypto

#шифрование #cryptojs #pycrypto

Вопрос:

У нас есть сценарий, в котором наше приложение angular вызывает наши внутренние API (разработанные с использованием django rest framework). Мы используем Jwt для аутентификации API. У нас есть один URL конечной точки, который принимает имя пользователя и пароль (POST-запрос) и аутентифицирует пользователя с помощью серверных систем django. Мы развернули оба приложения на HTTP-сервере APACHE и использовали SSL (Https) для шифрования.

Но мы также хотим зашифровать полезную нагрузку запроса (данные, отправленные в django API). В текущем случае зашифруйте имя пользователя и пароль из приложения angular и расшифруйте соответствующие данные в django. Для этого мы используем CryptoJS в приложении angular и Pycrypto в Django. Но мы не можем расшифровать данные в django.

Вот код функции дешифрования, который мы используем в приложении django:

 MODE = AES.MODE_CBC

key = 'k%eu6sy)hamp;vue#5yrpok#1)^1ya#l1t('

def decrypt(ciphertext,key, mode):
    encobj = AES.new('k%eu6sy)hamp;vue#5yrpok#1)^1ya#l1t(', AES.MODE_CBC)
    decrypted = encobj.decrypt(ciphertext)
    return decrypted.decode('utf-8')



ciphertext_user_name=request.data['username'].encode("utf8")
ciphertext_pwd=request.data['password'].encode("utf8")
usr = decrypt(ciphertext_user_name,key,MODE)
pwd = decrypt(ciphertext_pwd,key,MODE)

  

Мы также используем режим CBC в CryptoJS.

Приведенный выше код — это всего лишь пример кода. Может кто-нибудь подсказать, правильный ли это подход, или мы должны изменить подход и сделать что-то еще.

Заранее спасибо!

Ответ №1:

Может кто-нибудь подсказать, правильный ли это подход

Почему вы хотите шифровать полезную нагрузку отдельно (вне ssl)?

Когда дело доходит до учетных данных (имя пользователя, пароль), если вы шифруете в браузере, вам нужно где-то иметь ключ внутри скрипта. Это ничего не добавляет к безопасности, только увеличивает сложность решения.

Вы можете использовать асимметричный шифр (RSA, ECC) для шифрования данных с использованием открытого ключа сервера. О, подождите — HTTPS уже делает это за вас.

Шифрование на стороне клиента может иметь место там, где вы не хотите, чтобы сервер получал доступ к данным (например, защищенные сообщения, менеджер паролей, ..), Однако для имени пользователя и пароля серверу все равно необходимо прочитать и обработать учетные данные.

Но мы не можем расшифровать данные в django.

Здесь мы понятия не имеем, как вы шифруете данные на стороне клиента. Вы можете попытаться отредактировать свой вопрос и добавить код шифрования и сообщение об ошибке

или мы должны изменить подход и сделать что-то еще

Хотя в вашем коде определенно есть некоторые проблемы (я не могу сказать, все ли они)

  • зашифрованный текст (зашифрованные данные) обычно двоичный (с непечатаемыми символами). Вот почему при передаче в качестве параметров данные обычно кодируются в печатные общие символы (hex, base64, ..). Я вижу, что вы напрямую расшифровываете параметры, вы уверены, что данные не закодированы / размещены правильно?
  • Я вижу, что вы не используете какой-либо IV (вектор инициализации для режима CBC). Я предполагаю, что используемая вами библиотека будет просто использовать нулевой массив IV. Использование статического / нулевого IV ОЧЕНЬ небезопасно для режима CBC (или любого режима в целом). Вы уверены, что клиент не включает какой-то IV?
  • Режим CBC является гибким, вы должны применить некоторую проверку целостности (с секретом целостности в клиентском скрипте он также не добавляет никакого значения)

Все это уже сделано (и сделано хорошо) с использованием HTTPS, поэтому вы просто пытаетесь реализовать еще один уровень шифрования, который на самом деле не имеет дополнительной ценности (а также с очевидными недостатками). Я считаю, что общий совет здесь — с уверенностью полагаться на HTTPS

Комментарии:

1. Спасибо gusto2 за разъяснения. Мы будем использовать только HTTPS.