web-dev-qa-db-fra.com

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

Donc, avec de nombreux services différents à l'heure actuelle, les API Google, l'API Twitter, l'API Facebook, etc.

Chaque service possède 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 une langue spécifique, juste l'approche générale de la création de 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 (email/Twitter) et ils ont recommandé d'utiliser simplement un GUID avec les tirets supprimés.

Cela me semble cependant un peu hacky, en espérant avoir d'autres idées.

61
Phill

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

Ceci est un exemple C #:

var key = new byte[32];
using (var generator = RandomNumberGenerator.Create())
    generator.GetBytes(key);
string apiKey = Convert.ToBase64String(key);
39
Edward Brey

Les clés d'API doivent avoir les propriétés suivantes:

  • identifier de manière unique un utilisateur d'API autorisé - la partie "clé" de la "clé d'API"
  • authentifier cet utilisateur - ne peut pas être deviné/falsifié
  • peut être révoqué si un utilisateur se comporte mal - il saisit généralement une base de données qui peut avoir un enregistrement supprimé.

En règle générale, vous aurez des milliers ou des millions de clés API et non des milliards, elles n'ont donc pas besoin de:

  • Stockez de manière fiable des informations sur l'utilisateur de l'API, car elles peuvent être stockées dans votre base de données.

En tant que tel, 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. suffisamment de bits aléatoires pour remplir la clé

et signez-les en utilisant un secret privé.

Le compteur garantit qu'ils identifient de manière unique l'utilisateur et la signature empêche la falsification. 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 de clé API.

Un bon générateur 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 si vous n'avez pas autrement une bonne manière distribuée d'attribuer des numéros de série.


ou un hachage d'une chaîne aléatoire

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

25
Mike Samuel

J'utilise des UUID, formatés en minuscules sans tirets.

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

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

5
Adam Ralph

Si vous voulez une clé API avec uniquement des caractères alphanumériques, vous pouvez utiliser une variante de l'approche base64-random , en utilisant uniquement un encodage base-62 à la place. L'encodeur base-62 est basé sur this .

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();
}
1
Edward Brey

Une clé API doit avoir une valeur aléatoire. Assez aléatoire pour qu'il ne puisse pas être prédit. Il ne doit contenir aucun détail sur l'utilisateur ou le compte auquel il est destiné. L'utilisation des UUID est une bonne idée, si vous êtes certain que les ID créés sont aléatoires.

Les versions antérieures de Windows produisaient des GUID prévisibles, par exemple, mais c'est une vieille histoire.

1
Dave Van den Eynde