как зашифровать расшифровку данных между приложением angular и приложением django - PullRequest
0 голосов
/ 09 апреля 2019

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

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

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

MODE = AES.MODE_CBC

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

def decrypt(ciphertext,key, mode):
    encobj = AES.new('k%eu6sy)h&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 Ответ

1 голос
/ 09 апреля 2019

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

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

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

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

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

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

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

или мы должны изменить подход и заняться чем-то другим

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

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

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

...