Assim, com muitos serviços diferentes agora, APIs do Google, API do Twitter, API do Facebook, etc. etc.
Cada serviço possui uma chave de API, como:
AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q
Todas as chaves variam em comprimento e os caracteres que contêm. Estou me perguntando qual é a melhor abordagem para gerar uma chave de API?
Não estou pedindo uma linguagem específica, apenas a abordagem geral para a criação de chaves, caso sejam uma criptografia de detalhes do aplicativo do usuário, ou um hash, ou um hash de uma string aleatória, etc. Devemos nos preocupar com o algoritmo de hash (MSD, SHA1, bcrypt) etc?
Edit: Falei com alguns amigos (e-mail / twitter) e eles recomendaram apenas o uso de um GUID sem os traços.
No entanto, isso parece um pouco estranho para mim, na esperança de obter mais algumas idéias.
Respostas:
Use um gerador de números aleatórios projetado para criptografia. Então, a base 64 codifica o número.
Este é um exemplo C #:
var key = new byte[32]; using (var generator = RandomNumberGenerator.Create()) generator.GetBytes(key); string apiKey = Convert.ToBase64String(key);
fonte
apiKey
poderia ser declarado em outro lugar. Eu adicionei o tipo para maior clareza.As chaves de API precisam ter as propriedades que:
Normalmente, você terá milhares ou milhões de chaves de API, não bilhões, portanto, elas não precisam:
Assim, uma maneira de gerar uma chave de API é pegar duas informações:
e assine-os usando um segredo privado.
O contador garante que eles identifiquem o usuário de forma exclusiva e a assinatura evita falsificações. A revogabilidade exige a verificação de que a chave ainda é válida no banco de dados antes de fazer qualquer coisa que exija a autorização da chave API.
Um bom gerador de GUID é uma boa aproximação de um contador incrementado se você precisar gerar chaves de vários datacenters ou não tiver de outra forma uma boa maneira distribuída de atribuir números de série.
O hash não impede a falsificação. A assinatura é o que garante que a chave veio de você.
fonte
Eu uso UUIDs, formatados em letras minúsculas sem travessões.
A geração é fácil, pois a maioria das linguagens já vem incorporada.
As chaves de API podem ser comprometidas e, nesse caso, um usuário pode querer cancelar sua chave de API e gerar uma nova, portanto, seu método de geração de chave deve ser capaz de atender a esse requisito.
fonte
UUID uuid = UUID.randomUUID();
em Java? Você está dizendo que aleatório não é bom o suficiente?Se você deseja uma chave de API apenas com caracteres alfanuméricos, pode usar uma variante da abordagem base64-aleatória , usando apenas uma codificação base-62. O codificador de base 62 é baseado nisso .
public static string CreateApiKey() { var bytes = new byte[256 / 8]; using (var random = RandomNumberGenerator.Create()) random.GetBytes(bytes); return ToBase62String(bytes); } static string ToBase62String(byte[] toConvert) { const string alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; BigInteger dividend = new BigInteger(toConvert); var builder = new StringBuilder(); while (dividend != 0) { dividend = BigInteger.DivRem(dividend, alphabet.Length, out BigInteger remainder); builder.Insert(0, alphabet[Math.Abs(((int)remainder))]); } return builder.ToString(); }
fonte
Uma chave de API deve ser algum valor aleatório. Aleatório o suficiente para que não possa ser previsto. Ele não deve conter detalhes do usuário ou da conta a que se destina. Usar UUIDs é uma boa ideia, se você tiver certeza de que os IDs criados são aleatórios.
As versões anteriores do Windows produziam GUIDs previsíveis, por exemplo, mas essa é uma história antiga.
fonte