Правильный способ реализовать это - использовать взаимную аутентификацию SSL.
https://www.codeproject.com/Articles/326574/An-Introduction-to-Mutual-SSL-Authentication
В этой схеме устройству будет предоставлен локальный сертификат клиента, тогда все [1] конечные точки сервера, используемые вашими приложениями, будут проверять этот сертификат. Это, конечно, требует клиентского кода для подготовки сетевых подключений для представления этого сертификата и конфигурации сервера для его проверки. Это безопасно, так же как и ваш личный закрытый ключ, который, вероятно, защищен каким-то HSM. Если устройство взломано, это просто: только это одно устройство и, конечно, вы можете занести это устройство в черный список с сервера на основе сертификата, который он предоставляет (см. CRL).
Если вы делаете что-то еще, вы, вероятно, изобретаете колесо таким образом, чтобы иметь дыры в безопасности, потому что вы не потратили 20 лет на его разработку.
[1] Вы можете оставить открытыми определенные конечные точки, которые допускают ограниченную функциональность.
Это, вероятно, огромные инженерные усилия для вас и больше, чем ваши клиенты хотят потратить. Если они хотят принять замаскировку вместо реальной безопасности, вы можете попросить клиентов отправить в заголовке секрет (скажем, хэш серийного номера устройства + пароль или что-то в этом роде). Будет подготовительный этап, на котором вы зарегистрируете этот секрет на своем сервере и проверите его для каждого запроса. Помните, однако, что ничто не мешает вредоносному агенту сформулировать действительный запрос так же, как ваше приложение.