Eu encontrei muitas APIs que fornecem ao usuário uma chave de API e um segredo . Mas minha pergunta é: qual a diferença entre os dois?
A meu ver, uma chave pode ser o suficiente. Digamos que eu tenha uma chave e apenas eu e o servidor a saibamos. Eu crio um hash HMAC com essa chave e faço uma chamada de API. No servidor, criamos o hash HMAC novamente e o comparamos com o hash enviado. Se for o mesmo, a chamada é autenticada.
Então, por que usar duas chaves?
Editar: ou essa chave de API é usada para pesquisar o segredo da API?
api
security
authentication
api-key
secret-key
EsTeGe
fonte
fonte
Respostas:
A criptografia de chave secreta depende do uso da mesma chave para codificar e, posteriormente, decodificar uma mensagem. Assim, apenas quem conhece o "segredo" pode ler a mensagem.
A segurança RSA é baseada em 2 chaves correspondentes. Existe uma chave pública para cada usuário e todos podem (devem) conhecê-la. Também existe uma chave privada que apenas o usuário deve saber. Uma mensagem criptografada pela chave pública só pode ser descriptografada pela chave privada e vice-versa.
Assim, se eu quiser enviar a você uma mensagem que só você pode ler, eu pego (da rede) sua chave pública, criptografo a mensagem com essa chave e você é a única pessoa que pode descriptografá-la.
Ou, se eu quiser provar que enviei uma mensagem, posso criptografar a mensagem com minha chave privada, dizer a você (em texto aberto ou em outra mensagem) como ela foi criptografada. Então você pode descriptografar a mensagem com minha chave pública e, se ela se tornar legível, você saberá que veio de mim.
Essa forma de criptografia consome bastante o computador, então o que às vezes é feito é criptografar uma "chave secreta" única com tecnologia RSA, criptografar o restante da mensagem com a chave secreta e, em seguida, criptografar minha assinatura da segunda maneira. Em seguida, você reverte esse processo para que, se a mensagem e a assinatura puderem ser lidas, você e somente você poderá lê-la e ter a garantia de que enviei a mensagem.
OU
você pode visitar este link para uma explicação mais detalhada.
Como funcionam as chaves API e as chaves secretas?
fonte
Você precisa de duas chaves separadas, uma que diga quem você é e outra que prove que você é quem diz ser .
A "chave" é o seu ID de usuário e o "segredo" é a sua senha. Eles apenas usam os termos "chave" e "secreto" porque foi assim que os implementaram.
fonte
Bearer:
autenticação para isso? Você teria um ID e um pwd lá.Resposta simples, se entendi bem ...
Se você usar sua chave de API para criptografia, como o serviço saberá quem está entrando em contato com eles? Como eles vão descriptografar essa mensagem?
Você usa a chave API para indicar quem você é; isso é o que você está enviando em texto simples. A chave SECRETA que você não envia a ninguém. Você simplesmente o usa para criptografia. Então você envia a mensagem criptografada. Você não envia a chave que foi usada para criptografia, pois isso anularia o propósito.
fonte
secret
texto simples. Você pode me dar um link? O que vi está usandosecret
para criptografar alguns dados. E junto com os dados criptografados, enviarapiKey
para que o servidor saiba como descriptografar os dados.secret
eapiKey
e o que eles realmente estão fazendo éusername
epassword
. O que é uma coisa completamente diferente ...Existem respostas que explicam o que é a chave secreta e (pública). É um par de chaves pública-privada ao qual eles dão nomes confusos. Mas ninguém diz por que as APIs exigem ambos, e muitas APIs fornecem apenas um segredo! Eu também nunca vi nenhum documento de API explicando porque eles têm duas chaves, então o melhor que posso fazer é especular ...
É melhor colocar apenas sua chave pública em sua solicitação e assiná-la localmente com sua chave privada; o envio de mais nada não deve ser necessário. Mas alguns escapam apenas tendo o segredo do pedido. Ok, qualquer boa API usará alguma segurança de transporte como TLS (geralmente sobre HTTPS). Mas você ainda está expondo sua chave privada para o servidor dessa forma, aumentando o risco de eles, de alguma forma, a manipularem de maneira incorreta (consulte: bug do GitHub e do registro de senha do Twitter descoberto recentemente). E o HTTPS é teoricamente tão seguro, mas sempre há falhas de implementação por aí.
Mas muitas - na verdade, a maioria, ao que parece - APIs enviam ambas as chaves em solicitações, já que isso é mais fácil do que fazer as pessoas fazerem suas próprias assinaturas; não pode ter exemplos puros de cURL de outra forma! Nesse caso, é inútil separá-los. Eu acho que as chaves separadas são apenas para o caso de eles mudarem a API mais tarde para tirar proveito delas. Ou alguns têm uma biblioteca cliente que pode fazer isso da maneira mais segura.
fonte
Uma coisa que eu não vi mencionado aqui, embora seja uma extensão da resposta de Marcus Adams, é que você não deve usar uma única informação para identificar e autenticar um usuário se houver a possibilidade de ataques temporais , que podem use as diferenças nos tempos de resposta para adivinhar o quão longe uma comparação de strings foi.
Se você estiver usando um sistema que usa uma "chave" para procurar o usuário ou credencial, essa informação pode ser adivinhada de forma incremental ao longo do tempo, enviando milhares de solicitações e examinando o tempo que leva para seu banco de dados encontrar (ou não encontrar) um registro. Isso é especialmente verdadeiro se a "chave" for armazenada em texto simples, em vez de um hash unilateral da chave. Você gostaria de armazenar as chaves dos usuários em um texto simples ou criptografado simetricamente para o caso de precisar ser capaz de exibir a chave para o usuário novamente.
Ao ter uma segunda informação, ou "segredo", você pode primeiro procurar o usuário ou credencial usando a "chave", que pode ser vulnerável a um ataque de temporização e, em seguida, usar uma função de comparação segura de temporização para verificar o valor de o segredo".
Aqui está a implementação dessa função em Python:
https://github.com/python/cpython/blob/cd8295ff758891f21084a6a5ad3403d35dda38f7/Modules/_operator.c#L727
E é exposto na
hmac
biblioteca (e provavelmente em outras):https://docs.python.org/3/library/hmac.html#hmac.compare_digest
Uma coisa a ser observada aqui é que não acho que esse tipo de ataque funcionará em valores que são hash ou criptografados antes da pesquisa, porque os valores que estão sendo comparados mudam aleatoriamente cada vez que um caractere na string de entrada muda. Eu encontrei uma boa explicação disso aqui .
As soluções para armazenar chaves de API seriam:
Destes, acho que 3 é o melhor equilíbrio entre segurança e conveniência. Eu vi isso implementado em muitos sites ao obter as chaves emitidas.
Além disso, convido qualquer especialista em segurança real para criticar essa resposta. Eu só queria divulgar isso como outro ponto de discussão.
fonte