Если злоумышленник может получить доступ к ключу текущей версии в любой момент времени и имеет доступ к способу генерации и проверки — тяжело что-то придумать.
Если же нет, то первое, что приходит в голову, это постоянно изменяющийся идентификатор для каждой пары «вопрос-ответ», который клиент получает у сервера при каждом ответе, а следующим запросом подписывает секретом и возвращает серверу. Если сервер решает, что ключ валидный, он обрабатывает запрос и всё начинается заново.