Я использую HTTPS, но я думал, что он также использовался.
Все меры безопасности должны иметь четкое представление о том, от чего они будут вас защищать, и что вам нужноdo зависит от того, какие направления атаки вы пытаетесь охватить.
Похоже, вы обеспокоены тем, что кто-то может прочитать пароль в пути:
, но я понял, что на самом деле(вероятно) происходит то, что я отправляю незашифрованный пароль в POST-запросе на сервер
Вы ошибаетесь, когда говорите, что пароль отправляется в виде простого текста при использовании https,Https означает, что канал между сервером и браузером зашифрован и .. считается безопасным (*).Двойное шифрование не повышает безопасность, хотя может показаться, что выполнение дополнительной работы даст вам «что-то».
Если вы пытаетесь защитить от злоумышленника, который контролирует браузер или клиентский компьютер,тогда никакое количество шифрования на стороне клиента не поможет;Ситуация такая же, если вы пытаетесь защитить от злоумышленника, который контролирует сервер.
Одна из ситуаций, которая может привести к утечке паролей, - необработанные исключения во время процедуры POST.Большинство веб-приложений сообщают о таких ошибках либо по электронной почте, либо через такие службы, как Sentry.Веб-фреймворки обычно имеют способ смягчить эту проблему, который является более общим и более простым для работы, чем шифрование на стороне клиента (например, @sensitive_post_parameters(...)
https://docs.djangoproject.com/en/2.1/howto/error-reporting/#django.views.decorators.debug.sensitive_post_parameters).
в Django). Одна из ситуаций, когда вы используете шифрование на стороне клиента, -если пользователь хочет сохранить / получить на сервере данные, которые администратор сервера не сможет прочитать. Сервер не может взаимодействовать с данными, поэтому он не используется для паролей при входе в систему.
(*) если вы хотите защититься от кого-то, кто может расшифровать канал https, вы выходите за рамки того, что необходимо для формы входа для обычных веб-сайтов (и если вы работаете в АНБ, вам, вероятно, следует спросить внутренне, а нена SO; -)
ps: вы, вероятно, не должны декодировать ('utf-8') результат bcrypt.gensalt()
- я не смотрел, но не могу себе представить, что он возвращает utf-8 data.
дополнение: не все двоичные данные имеют формат utf-8. base64
- это один из способов создания представления в юникоде:
>>> b = b'\xc3\x28' # byte sequence that is not valid utf-8
>>> b.decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 0: invalid continuation byte
>>> import base64
>>> base64.b64encode(b)
b'wyg='
>>> base64.b64encode(b).decode('ascii')
'wyg='
>>>