Относительно MD5:
md5 - это не алгоритм шифрования, это алгоритм хеширования.Это превратит любую строку в 16-байтовый хеш.Теоретически:
Если у вас есть два объекта, a и b, и md5 (a) == md5 (b), то a == b
Если у вас есть md5 (a), вы не можете понять a.
Это неявные предположения при работе с хэшами, хотя на самом деле они никогда не верны - числоодно явно неверно, потому что если вы хешируете 2 ^ 16 + 1 разных строк, то по принципу Pigeonhole должны быть две разные строки с одинаковым хешем.Второе также явно не соответствует действительности, поскольку злоумышленник может искать диапазон значений md5 для хэша, хотя для современных криптографически безопасных хэшей (не md5) это недопустимо.
Приступая к вашему вопросу, вы могли быпросто спросите у клиента хэш md5 пароля пользователя (вам понадобится JavaScript на стороне клиента, чтобы рассчитать это), но это ужасная идея.Если все, что вы ожидаете от пользователя, это md5 ее пароля, то это все, что нужно знать злоумышленнику, и вы отправляете его в виде простого текста.Что вы можете сделать, это отправить клиенту nonce .Это как вызов.Чтобы клиент мог доказать, что знает свой пароль, он может выслать вам хэш одноразового номера и объединить свой пароль.Идея состоит в том, что любой злоумышленник не может ответить на вызов, потому что он знает только одноразовый номер, и после передачи хэша одноразового пароля для него уже слишком поздно, потому что вы его уже получили и не ожидаете ответа на этот одноразовый номер.снова.Свойство 2 гарантирует, что он не сможет извлечь пароль из хеша.
Это уязвимо для злоумышленника, который крадет ответ на вызов и получает его до того, как это сделает клиент.Вы можете получить массу удовольствия, создав целую криптосистему с многократным обменом данными (нелогично, что на самом деле можно отправлять хэши туда-сюда и безопасно проходить аутентификацию), но вскоре вы просто внедряете HTTPS, который кто-то другой уже сделал для вас:)