Donc, avec de nombreux services différents actuellement, des API Google, des API Twitter, des API Facebook, 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 de la création de clés, devrait-il s'agir d'un cryptage des détails de l'application des utilisateurs, ou d'un hachage, ou d'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 un peu hacky cependant, dans l'espoir d'avoir plus d'idées.
Réponses:
Utilisez un générateur de nombres aléatoires conçu pour la cryptographie. Puis base-64 encodez le nombre.
Ceci est un exemple C #:
var key = new byte[32]; using (var generator = RandomNumberGenerator.Create()) generator.GetBytes(key); string apiKey = Convert.ToBase64String(key);
la source
apiKey
je pouvais être déclaré ailleurs. J'ai ajouté le type pour plus de clarté.Les clés API doivent avoir les propriétés qu'elles:
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:
En tant que tel, une façon de générer une clé API consiste à prendre deux informations:
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 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 si vous ne disposez pas d'une bonne manière distribuée d'attribuer des numéros de série.
Le hachage n'empêche pas la contrefaçon. La signature est ce qui garantit que la clé vient de vous.
la source
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 API peuvent être compromises, auquel cas un utilisateur peut souhaiter annuler sa clé API et en générer une nouvelle, votre méthode de génération de clé doit donc être en mesure de répondre à cette exigence.
la source
UUID uuid = UUID.randomUUID();
en Java? Êtes-vous en train de dire que le hasard n'est pas assez bon?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 cela .
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(); }
la source
Une clé API doit être une valeur aléatoire. Assez aléatoire pour que cela ne puisse ê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.
la source