Я думаю, что ваша проблема - статическая подпись.
Если вы посмотрите, как это делает AWS (я фанат не изобретать колеса, если кто-то уже делает это хорошо), их сигнатура хешируется всеми параметрами запроса. одна из которых обязана быть меткой времени.
Это важно, поскольку это означает, что подпись быстро меняется даже для повторных запросов на одни и те же данные. Назначение метки времени также означает, что вы можете гарантировать, что запросы имеют относительно короткую достоверность, при условии, что часы на клиенте и сервере не слишком далеко друг от друга. У меня, конечно, не было бы этого до 2 часов - я бы сократил окно до 15 минут.
Думайте об этом как об открытых и закрытых ключах. Вы можете опубликовать открытый ключ (api_key), но закрытый ключ должен быть известен только клиенту и серверу.
Закрытый ключ не должен передаваться в запросах, и передача его статического хэша также невелика - отсюда и подход Amazon.
Если для начала вам необходимо передать закрытый ключ на устройство, мне будет очень неудобно передавать его с той же полезной нагрузкой, что и ключ api_key, но вам, вероятно, следует посоветоваться с экспертом по безопасности на данном этапе, так как Я не в себе и рад это признать.