Melhor abordagem para gerar a chave da API

Então, com muitos serviços diferentes ao redor agora, Google APIs,Twitter API, Facebook API, etc.

cada serviço tem uma chave API, como:

AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q

todas as chaves variam em comprimento e os caracteres que contêm, pergunto-me qual é a melhor abordagem para gerar uma chave API?

não estou a pedir uma linguagem específica, apenas a abordagem geral para criar chaves, se elas forem uma encriptação dos detalhes do aplicativo de utilizadores, ou um hash, ou um hash de um aleatório string, etc. Devemos nos preocupar com o algoritmo de hash (MSD, SHA1, bcrypt) etc?

editar: Eu falei com alguns amigos (e-mail/twitter) e eles recomendaram apenas usar um GUID com os traços despojados.

Isto parece-me um pouco estranho, na esperança de ter mais ideias.

Author: Edward Brey, 2013-01-19

5 answers

Utilize um gerador de números aleatórios concebido para criptografia. Então base-64 codificar 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);
 31
Author: Edward Brey, 2018-03-01 16:19:09

As teclas API precisam de ter as propriedades que eles:

  • identificar exclusivamente um utilizador autorizado da API -- a parte " chave "da" chave da API "
  • autenticar esse utilizador -- não se pode adivinhar / falsificar
  • pode ser revogado se um utilizador se comportar mal -- normalmente eles entram numa base de dados que pode ter um registo apagado.

Normalmente você terá milhares ou milhões de chaves API não bilhões, então eles não precisam:

  • Guardar de forma fiável informações sobre a API usuário porque isso pode ser armazenado em sua base de dados.

Como tal, uma maneira de gerar uma chave de API é tirar duas informações:

  1. um número de série para garantir a unicidade
  2. bits aleatórios suficientes para apagar a chave
E assina-os usando um segredo privado. O contador garante que eles identificam o usuário de forma única, e a assinatura impede a falsificação. A revogabilidade requer a verificação de que a chave ainda é válida na base de dados antes fazer qualquer coisa que requeira autorização API-key.

Um bom gerador de GUID é uma boa aproximação de um contador incrementado se você precisa gerar chaves de vários centros de dados ou não tem uma boa maneira distribuída para atribuir números de série.


Ou um haxixe de uma cadeia Aleatória

O chicote não impede a falsificação. Assinar é o que garante que a chave veio de ti.
 20
Author: Mike Samuel, 2014-06-23 17:07:28

Uso UUIDs, formatados em minúsculas sem erupções cutâneas.

A geração é fácil, já que a maioria das línguas A tem incorporada.

As chaves de API podem ser comprometidas, caso em que um utilizador pode querer cancelar a sua chave de API e gerar uma nova, por isso o seu método de geração de chaves deve ser capaz de satisfazer este requisito.

 5
Author: Adam Ralph, 2013-01-20 09:08:31

Uma Chave API deve ser um valor aleatório. Aleatório o suficiente para não poder ser previsto. Ele não deve conter quaisquer detalhes do usuário ou conta que é para. Usar UUIDs é uma boa idéia, se você tem certeza de que os IDs criados são aleatórios.

As versões anteriores do Windows produziram guias previsíveis, por exemplo, mas esta é uma história antiga.
 1
Author: Dave Van den Eynde, 2013-01-20 09:26:41

Se quiser uma tecla API com apenas caracteres alfanuméricos, poderá usar uma variante da abordagem base64-random , usando apenas uma codificação base-62 em alternativa. O codificador base-62 é baseado em Este .

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();
}
 0
Author: Edward Brey, 2018-06-20 20:35:58