Para resumir:
- Você possui uma chave de API emitida por um fornecedor para poder usá-la e tem a obrigação de impedir que essa chave seja conhecida por mais alguém
- Você está fazendo chamadas para a API desse fornecedor (que requer a chave da API) no código do aplicativo
- Você está implantando o aplicativo em sistemas em que os clientes têm acesso aos binários e, portanto, podem potencialmente descompilar / desobstruir o código ou interceptar o tráfego
A melhor maneira de impedir o comprometimento dessa chave é manter o controle dela. Isso significa que nunca deve ser implantado em um servidor onde ninguém além de você possa ler o binário e nunca passar por um link de comunicação que você não controla.
Por fim, se os binários estiverem fora de seu controle, tudo neles estará fora de seu controle. Da mesma forma, se alguém puder interceptar o tráfego, poderá capturar a chave da API ( potencialmente mesmo se você estiver usando SSL ).
Eu posso ver duas maneiras principais de fazer isso, as quais não incluem sua chave de API privada no aplicativo implantado:
Obtenha uma chave de API exclusiva para cada implantação
Isso exigiria algum relacionamento adicional com o fornecedor, onde você pode obter chaves ou fazer com que seus clientes obtenham chaves.
Na verdade, isso é bastante comum com, por exemplo, produtos que usam a API do Google Maps. O criador do software tem sua própria chave que eles usam ao desenvolver / executar sua cópia, mas não a incluem no software e, em vez disso, exigem que você, como usuário que instala o software, acesse o Google e obtenha sua própria API chave. O software apenas possui uma opção de configuração para definir a chave da API do Google Maps.
De fato, muitos fornecedores que emitem chaves de API contratualmente exigem que você faça as coisas dessa maneira; portanto, você pode estar no caminho errado de qualquer maneira, e essa pode ser a única solução que você pode usar de acordo com os Termos de Serviço e os Termos de Serviço do fornecedor. / ou quaisquer contratos legais que você possa ter com eles.
Use um proxy
Configure uma API proxy, em que seu aplicativo chama sua API (em seus servidores) e, por sua vez, sua API chama a API do fornecedor usando a chave
Você pode precisar de proteção adicional em sua API, por exemplo, algo para garantir que apenas seu aplicativo a esteja usando. Isso pode ser feito por:
- tornando a funcionalidade tão específica, mas seu aplicativo pode usá-la
- Listas brancas de IP
- Algum mecanismo de licenciamento / autorização existente que você já possui para seus servidores
- Seu próprio sistema de chaves de API, no qual você pode emitir chaves para seus clientes
O que você deve ter em mente aqui é que você pode não ter permissão para fazer isso. Seu fornecedor pode ter Termos de Serviço ou contratos legais que o impedem de criar um "serviço de agregação" ou proxy, portanto, você precisa verificar isso.
Como lidar com o mau comportamento
Mesmo que sua chave não seja comprometida, se um de seus clientes estiver fazendo algo que faça com que o fornecedor bloqueie sua chave, de repente TODOS os seus clientes serão desativados e sua única solução será atualizar todos os outros.
Da mesma forma, se você deseja bloquear um de seus clientes (por exemplo, eles pararam de pagar, piratearam o software etc.), você não pode fazê-lo sem emitir uma atualização para todos os outros e desabilitar a chave.
A logística disso para qualquer coisa além de um punhado de clientes rapidamente se tornará insustentável.
Independentemente de você atuar como proxy ou ter uma chave exclusiva para cada instalação, você pode lidar com qualquer uma dessas situações com relativa facilidade (e com pouco ou nenhum impacto para outras pessoas).
Tentar proteger a chave enquanto ela está incorporada ao seu software é um esforço inútil. Não importa o que você faça, qualquer invasor que tenha acesso aos binários, origem e / ou canal de comunicação e esteja determinado o suficiente para acessar sua chave poderá fazer isso.
Portanto, não o incorpore. "A única jogada vencedora é não jogar."