Meilleure approche pour générer la clé API

donc avec beaucoup de différents services autour de Maintenant, Google APIs, API Twitter, API Facebook, etc etc

chaque service a une clé API, comme:

AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q

toutes les clés varient en longueur et les caractères qu'elles contiennent, je me demande Quelle est la meilleure approche pour générer une clé API?

Je ne demande pas un langage spécifique, juste l'approche générale pour créer des clés, devraient - elles être un cryptage des détails de l'application des utilisateurs, ou un hachage, ou un hachage d'une chaîne aléatoire, etc. Devrions-nous nous soucier de l'algorithme de hachage (MSD, SHA1, bcrypt) etc?

Edit: J'ai parlé à quelques amis (E-Mail/twitter) et ils ont recommandé juste d'utiliser un GUID avec les tirets dépouillés.

Cela semble un peu hacky pour moi, en espérant avoir quelques idées.

45
demandé sur Edward Brey 2013-01-19 11:26:33

5 réponses

Utilisez un générateur de nombres aléatoires conçu pour la cryptographie. Puis la base-64 encodera le numéro.

C'est un exemple en C#:

var key = new byte[32];
using (var generator = RandomNumberGenerator.Create())
    generator.GetBytes(key);
string apiKey = Convert.ToBase64String(key);
31
répondu Edward Brey 2018-03-01 16:19:09

les clés API doivent avoir les propriétés suivantes:

  • identifier de façon unique un utilisateur D'API autorisé -- la partie "clé" de "clé D'API"
  • authentifier l'utilisateur-ne peut pas être deviné/forgé
  • peut être révoqué si un utilisateur se comporte mal -- typiquement, ils tapent dans une base de données qui peut avoir un enregistrement supprimé.

typiquement vous aurez des milliers ou des millions de clés API pas des milliards, donc ils n'ont pas besoin de:

  • de manière Fiable stockez des informations sur L'utilisateur de L'API parce que cela peut être stocké dans votre base de données.

ainsi, une façon de générer une clé API est de prendre deux informations:

  1. un numéro de série pour garantir l'unicité
  2. assez de bits aléatoires pour combler la touche

et les signer en utilisant un secret privé.

le compteur garantit qu'ils identifient uniquement l'utilisateur, et la signature empêche la contrefaçon. La révocabilité nécessite de vérifier que la clé est toujours valide dans la base de données avant de faire quoi que ce soit qui nécessite une autorisation API-clé.

un bon générateur de GUID est une assez bonne approximation d'un compteur incrémenté si vous avez besoin de générer des clés à partir de plusieurs centres de données ou n'avez pas autrement une bonne façon distribuée d'assigner des numéros de série.


ou un hash d'une chaîne de caractères aléatoires

le hachage n'empêche pas la contrefaçon. Signature est ce qui garantit que la clé vient de vous.

20
répondu Mike Samuel 2014-06-23 17:07:28

j'utilise des UUIDs, formatés en minuscules sans tirets.

la génération est facile puisque la plupart des langues l'ont intégrée.

les clés API peuvent être compromises, auquel cas un utilisateur peut vouloir annuler sa clé API et en générer une nouvelle, de sorte que votre méthode de génération de clés doit être en mesure de satisfaire cette exigence.

5
répondu Adam Ralph 2013-01-20 09:08:31

une clé API doit être une valeur aléatoire. Assez aléatoire pour qu'on ne puisse pas le prédire. Il ne doit pas contenir de détails sur l'utilisateur ou le compte auquel il est destiné. Utiliser UUIDs est une bonne idée, si vous êtes certain que les ID créés sont aléatoires.

les versions précédentes de Windows produisaient des GUIDs prévisibles, par exemple, mais c'est une vieille histoire.

1
répondu Dave Van den Eynde 2013-01-20 09:26:41

si vous voulez une clé API avec seulement des caractères alphanumériques, vous pouvez utiliser une variante du base64 aléatoire approche, uniquement à l'aide d'une base-62 codage au lieu de cela. L'encodeur base-62 est basé sur .

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
répondu Edward Brey 2018-06-20 20:35:58