Да, DNS небезопасен. Если вы действительно хотите знать, что вы говорите с сервером, который вы хотели, вы должны аутентифицировать сервер. Вот что мы делаем. Мы не доверяем DNS как безопасному, и мы реализуем необходимую нам безопасность где-то еще, например, TLS (Transport-Layer Security).
TLS (современный уровень безопасности HTTPS) делает это, заставляя сервер отправлять клиенту сертификат с указанием имени и открытого ключа сервера. Этот сертификат криптографически подписан доверенной третьей стороной, называемой центром сертификации (CA). Подпись CA подтверждает, что сертификат показывает правильный открытый ключ для указанного сервера.
Чтобы доказать, что сервер является законным владельцем сертификата (а не какого-либо самозванца, который украл действительный сертификат), подтверждение связи TLS позволяет ему доказать, что ему известен секретный закрытый ключ, который образует соответствующий набор с открытым ключом в сертификате. Конечно, это делается без раскрытия самого секретного ключа.
Существует предложение по обеспечению безопасности DNS, которое называется DNSsec, но оно существует уже много лет и, похоже, никуда не денется. Это может никогда не стать широко развернутым. В настоящее время существует предложение для «DNS через HTTP» (DoH, произносится «D'oh!»), Которое могло бы защитить DNS, делая это по HTTPS.