2011-06-04 2 views
2

Regardé sur google et n'a rien trouvé.Développer un service avec des clés API (point de départ)

Toutes les bonnes ressources pour commencer à concevoir mon backend pour une application Web RESTless qui va s'appuyer fortement sur les clés API.

Je sais comment écrire des webservices agités, etc., je n'ai jamais utilisé de clés API. Généralement les gens génèrent-ils juste des guids pour des utilisateurs etc.?

Répondre

2

Les GUID ne sont généralement pas assez "aléatoires" et peuvent facilement être devinés par les méchants. Prenez quelques données «aléatoires» comme le hash du mot de passe de l'utilisateur, quelques nombres aléatoires et exécutez le résultat via sha1 ou une fonction de hachage similaire.

Si vous voulez une clé API par compte, ajoutez-la simplement à la table de métadonnées du compte. Sinon, utilisez une table liée à accountIds pour stocker les clés api. Côté serveur, utilisez un cache en utilisant la clé API comme clé pour stocker temporairement les métadonnées du compte. Vous n'avez donc besoin d'accéder à la base de données qu'une fois par session.

Et bien sûr, tout doit aller sur https pour éviter que la clé API soit volée. Maintenant, si votre service est orienté "session", vous pouvez envisager d'utiliser une clé de session temporaire afin de ne pas avoir à exposer la clé API. Recherchez le cryptage de clé publique pour approfondir cette question.

+0

« Guids ne sont généralement pas assez aléatoires et peuvent être facilement devinés »? Je ne suis pas sûr d'être d'accord avec ça. http://stackoverflow.com/questions/184869/are-guid-collisions-possible – toxaq

+0

Une partie du GUID est liée à la machine, souvent l'adresse IP ou MAC, l'heure de la journée, l'adresse de l'objet générant l'UID, une séquence compteur. Cela rend astronomiquement improbable que le même ID est généré dans des conditions normales d'utilisation. Cependant un attaquant qui veut créer une collision peut utiliser un autre GUID pour déterminer les bits communs et deviner les bits 'changeants' qui sont un sous-ensemble relativement petit qui est beaucoup plus facile à force brute. En fait, les réponses à la question à laquelle vous faites référence illustrent bien cela. –

+0

Je ne crois pas que ce soit encore vrai pour UUID v4, qui devrait être entièrement "aléatoire", et c'est ce qui devrait être utilisé. Est-ce que votre hypothèse qu'un GUID n'est pas adapté à une clé API? – toxaq

4

Voilà comment je crée des clés de l'API pour un service Web:

string CreateApiKey(int length) 
{ 
    var bytes = new byte[length * 2]; 
    using (var rng = new RNGCryptoServiceProvider()) 
     rng.GetBytes(bytes); 
    var chars = Convert.ToBase64String(bytes) 
     .Where(char.IsLetterOrDigit) 
     .Take(length) 
     .ToArray(); 
    var key = new String(chars); 
    return key; 
} 
Questions connexes