Melhor maneira de ocultar a chave da API no código-fonte

12

Preciso de algumas idéias sobre como proteger uma chave de API privada em um aplicativo, especificamente em um aplicativo ac # .NET.

Em primeiro lugar, entendo que é teoricamente impossível ocultar qualquer coisa no código-fonte, então tive outra idéia, mas não tenho certeza de quão plausível é. De qualquer forma, seria possível, de alguma forma, se comunicar com um servidor da Web para verificar a chave privada e depois responder ao aplicativo para confirmar que é um aperto de mão legítimo?

Tenho duas chaves para trabalhar: uma chave pública (como o nome sugere, ela não precisa ser tratada com o mesmo cuidado que a privada) e uma chave privada, que precisa ser mantida em segurança dos outros.

Qualquer idéia de como eu poderia fazer isso seria muito apreciada.

Spencer
fonte
4
Você está tentando impedir que alguém que tenha acesso a um aplicativo binário implantado leia a chave (como o título indica) ou protege-os de modificá-la (como implica sua idéia de verificação via servidor)? Qual é o objetivo final final?
gregmac
3
Pode ser benéfico descrever o conceito de uma chave de API para leitores não familiarizados com ela. Uma chave de API é um segredo concedido ao desenvolvedor de algum software que interage com um serviço (normalmente um serviço da Web). É usado para identificar a origem do tráfego, suspender restrições versus acessos anônimos e cobrar o proprietário da chave pelo uso do serviço. Você deve mantê-lo moderadamente oculto e, de preferência, revogá-lo se estiver comprometido. Como ele precisa ser comunicado integralmente ao serviço, você sempre perde.
Lars Viklund
@gregmac Sim, estou tentando impedir que usuários do aplicativo leiam a chave.
Spencer
Não colocá-lo lá
CodeART

Respostas:

12

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."

gregmac
fonte
2
+1 em "Obter uma chave de API exclusiva para cada implantação". Pode até ser usado em conjunto com o proxy, oferecendo a você [capacidade] limitada de desativar chaves / clientes impertinentes.
Svidgen
@svidgen Muito bom ponto, eu adicionei uma seção discutindo isso. Obrigado.
gregmac
+1, uma chave universal quase sempre o morderá no ***
Wyatt Barnett
Resposta muito profunda. Infelizmente, apenas uma chave de API privada foi atribuída, portanto, não é possível solicitar ao usuário que busque uma chave, pois estou no NDA com os protocolos de rede, portanto, o motivo de uma chave privada. O proxy provavelmente também está fora da questão. Talvez eu precise apenas transformá-lo em um formato legível não humano e colocá-lo em algum lugar na fonte - não é uma ótima opção, mas não há muitas opções.
Spencer
4

Se você possui uma chave no código do objeto, é público por definição. Existem hacks em torno de ofuscadores que rapidamente descompilam o código do objeto. Uma chave privada estaria fora do código do objeto e em outro arquivo. A parte difícil é fornecer essa chave privada ao usuário. Depois de fornecida, você pode usar uma assinatura da chave privada, anexada ao final do arquivo, e uma chave pública no aplicativo, para verificar a integridade da chave privada. Um servidor da web também pode fazer essa verificação, se você tiver um canal de comunicação seguro.

Frank Hileman
fonte