Когда вы предполагаете, что C действует как противник, подслушивает и способен создавать сообщения на основе полученной информации, вам нужно тщательно разрабатывать свой протокол. Это происходит из-за того, что C потенциально может ретранслировать, воспроизводить и создавать сообщения. Следовательно, вам необходимо предотвращать повторные атаки и атаки «человек посередине», а также обрабатывать несколько (одновременных) сеансов протокола.
Вы уже поняли, что статической подписи может быть недостаточно. По сути, ваша проблема заключается в мотивации протоколов аутентификации, и их дизайн нетривиален: если вы посмотрите на протокол Нидхэма-Шредера 1 или протокол Ву-Лама 2 вы увидите, что непредвиденные векторы атаки могут нарушить ваш протокол, поскольку оба примера небезопасны в своих исходных версиях.
В основном, некоторые лучшие практики для разработки безопасного протокола:
- Сделать максимально пессимистическое предположение
- Поместите отправителя и получателя в сообщения (т.е. их открытые ключи)
- Используйте шифрование, чтобы гарантировать, что только правильный получатель может прочитать содержимое
- Используйте одноразовые номера / временные метки, чтобы получить свежесть
- Создавайте одноразовые номера самостоятельно, чтобы предотвратить повторные атаки
- Всегда подписывать и шифровать компоненты вместе
Но все же: есть протоколы, считающиеся безопасными, которые не следуют всем пунктам, и небезопасные протоколы, которые соблюдают.
В любом случае вы хотели бы проанализировать свой протокол (полуавтоматически), используя, например, проверку модели или доказательство теоремы.