Прежде всего: не изобретайте свой собственный протокол аутентификации.Период.Если вы это сделаете, вы получите неправильно, даже если вы используете надежное шифрование.Существует целый ряд хорошо документированных протоколов аутентификации, которые были проверены криптографами и поэтому считаются безопасными.Не поддавайтесь искушению «упростить» их, они уже были упрощены.
Второе: ИМХО, вы никогда не должны отправлять пароли по проводам для аутентификации (я не знаю ни одного протокола аутентификации, которыйвключая ужасно небезопасный протокол NTLMv1. [1]Предостережение: я не криптограф - я считаю, что в том, что я здесь описываю, есть серьезные недостатки):
Вместо прямой отправки пароля отправьте одностороннюю функцию (также известную какOWF, часто реализуемый как криптографический хеш, такой как SHA256 или более сильный) пароля.
Другими словами, пусть сервер отправит клиенту солт-значение, добавит солт к паролю, вычислит OWF значения пароль + соль и отправит результат OWF на сервер.На сервере добавьте соль к паролю, а также выполните расчет OWF.Если результаты совпадают, пароль действителен, если нет, то он недействителен.
И, наконец, все, что вы делаете, проверено настоящим криптографом.Они найдут проблемы в вашей реализации, и вам придется их исправить.Они, скорее всего, предложат вам отказаться от ваших усилий в пользу существующего опубликованного протокола.
[1] AFAIK, единственный раз, когда вы должны отправить пароль по проводам, это когда вы меняете пароль идаже тогда вы должны добавить длину, кратную размеру блока (включая длину в кибертексте, чтобы при ее расшифровке вы могли различать пароль и заполнение).