#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.