Для (б) я думаю, вы делаете ответ-вызов.
Сервер генерирует случайную строку, отправляет ее клиенту. Клиент добавляет его к паролю и хэширует все, отправляет хэш обратно на сервер. Сервер выполняет те же вычисления, сравнивает результат с тем, что получил от клиента. Если они совпадают, клиент отправил правильный пароль.
Наиболее очевидная уязвимость заключается в том, что если кто-то подхватывает обе стороны обмена, он может затем запустить автономную атаку по словарю против пароля.