Прежде всего, позвольте мне сказать, что вы не компетентны для безопасного внедрения этой системы. Я тоже нет. Почти никто не . Вам нужен специалист по безопасности, чтобы сделать эту работу; если вы попытаетесь применить собственную безопасность, вы ошибетесь и создадите систему, которая может быть взломана злоумышленниками.
Это не по пути: вы четко определили слабость вашей системы. Вы храните эквивалент пароля ; если злоумышленник получит эквивалент пароля, тогда не имеет значения, есть ли у него пароль или нет; у них есть информация, достаточная, чтобы выдать себя за пользователя.
Решение ясно. Если это причиняет вам боль, не делайте этого. Не храните эквивалент пароля, если система, в которой он хранится, не может быть надежной и защищенной от атак.
Если вы одержимы хранением эквивалента пароля, храните его в хранилище, доступ к которому злоумышленникам труднее получить, чем в файловой системе. Если вы действительно решили хранить опасные вещи от имени пользователя, то вы можете использовать API защиты данных Windows, чтобы хранить их в зашифрованном хранилище, зашифрованном с использованием учетных данных пользователя:
http://msdn.microsoft.com/en-us/library/ms995355.aspx
Но лучше вообще не хранить эквивалент пароля.
Предположим, вы не храните эквивалент пароля. Вы еще не закончили. Вам все еще нужно рассмотреть повторные атаки. Предположим, злоумышленник подслушивает незащищенный канал. Пользователь вводит свой пароль, он хэшируется и отправляется на сервер. Подслушиватель записывает хешированный пароль, и теперь он у него есть.
Чтобы решить эту проблему, сервер отправляет клиенту случайное число. Номер больше никогда не будет использоваться; это единовременно. Клиент кеширует хешированный пароль со случайным числом, а затем шифрует результат с помощью открытого ключа сервера. Зашифрованное сообщение xor'd отправляется на сервер.
Сервер дешифрует хеш с помощью своего закрытого ключа, перезаписывает его случайным числом, которое он отправил ранее, и определяет, что дешифрованный хеш соответствует паролю, который он хранит. Теперь перехватчик не может воспроизвести перехваченный эквивалент пароля, потому что они никогда не увидят одно и то же случайное число снова.
Теперь, это уязвимо для атаки "человек посередине", если клиент не знает открытый ключ сервера! Если сервер отправляет открытый ключ клиенту, то посредник может перехватить открытый ключ сервера и заменить его его открытым ключом. Теперь посредник может предоставить открытый ключ и для «случайного» вызова, и клиент откажется от пароля, эквивалентного.
Как я уже сказал, это тяжелые вещи. Не пытайтесь сделать это самостоятельно. Получить профессионала.