Je suis tombé sur de nombreuses API qui donnent à l'utilisateur à la fois une clé API et un secret . Mais ma question est: quelle est la différence entre les deux?
À mes yeux, une clé peut suffire. Disons que j'ai une clé et que seuls moi et le serveur la connaissons. Je crée un hachage HMAC avec cette clé et fais un appel API. Sur le serveur, nous créons à nouveau le hachage HMAC et le comparons avec le hachage envoyé. Si c'est la même chose, l'appel est authentifié.
Alors pourquoi utiliser deux clés?
Edit: ou cette clé API est-elle utilisée pour rechercher le secret API?
Réponses:
La cryptographie à clé secrète repose sur l'utilisation de la même clé pour encoder puis décoder ultérieurement un message. Ainsi, seuls ceux qui connaissent le "secret" peuvent lire le message.
La sécurité RSA est basée sur 2 clés correspondantes. Il existe une clé publique pour chaque utilisateur, et tout le monde peut (devrait) la connaître. Il existe également une clé privée que seul l'utilisateur doit connaître. Un message chiffré par la clé publique ne peut être déchiffré que par la clé privée, et vice versa.
Ainsi, si je veux vous envoyer un message que vous seul pouvez lire, j'obtiens (du réseau) votre clé publique, je crypte le message avec cette clé et vous êtes la seule personne à pouvoir le décrypter.
Ou, si je veux vous prouver que j'ai envoyé un message, je peux crypter le message avec ma clé privée, vous dire (en texte ouvert ou dans un autre message) comment il a été crypté. Ensuite, vous pouvez déchiffrer le message avec ma clé publique, et s'il devient lisible, vous savez qu'il vient de moi.
Cette forme de cryptage est assez gourmande en informatique, donc ce qui est parfois fait est de crypter une «clé secrète» unique avec la technologie RSA, puis de crypter le reste du message avec la clé secrète, puis de crypter ma signature de la seconde manière. Vous inversez ensuite ce processus afin que si le message et la signature sont lisibles, vous et vous seul pouvez le lire et vous êtes assuré que j'ai envoyé le message.
OU
vous pouvez visiter ce lien pour des explications plus détaillées.
Comment fonctionnent les clés API et les clés secrètes?
la source
Vous avez besoin de deux clés distinctes, l'une qui leur indique qui vous êtes et l'autre qui prouve que vous êtes qui vous dites être .
La "clé" est votre identifiant d'utilisateur et le "secret" est votre mot de passe. Ils utilisent simplement les termes «clé» et «secret» parce que c'est ainsi qu'ils l'ont implémenté.
la source
Bearer:
authentification pour cela? Vous auriez une pièce d'identité et un mot de passe là-bas.Réponse simple, si je l'ai bien compris ...
Si vous utilisez votre clé API pour le chiffrement, comment le service saura-t-il qui les contacte? Comment décrypteront-ils ce message?
Vous utilisez la clé API pour indiquer qui vous êtes, c'est ce que vous envoyez en texte brut. La clé SECRET que vous n'envoyez à personne. Vous l'utilisez simplement pour le cryptage. Ensuite, vous envoyez le message crypté. Vous n'envoyez pas la clé qui a été utilisée pour le chiffrement, cela irait à l'encontre de l'objectif.
la source
secret
en texte brut. Pouvez-vous me donner un lien? Ce que j'ai vu utilisesecret
pour crypter certaines données. Et avec les données cryptées, l'envoiapiKey
afin que le serveur sache comment décrypter les données.secret
etapiKey
et ce qu'ils font réellement estusername
etpassword
. Ce qui est complètement différent ...Il existe des réponses expliquant ce qu'est la clé secrète et (publique). C'est une paire de clés publique-privée à laquelle ils donnent des noms confus. Mais personne ne dit pourquoi les API nécessitent les deux, et de nombreuses API ne vous donnent qu'un seul secret! Je n'ai jamais vu la documentation d'API expliquer pourquoi elles ont deux clés, donc le mieux que je puisse faire est de spéculer ...
Il est préférable de ne mettre que votre clé publique dans votre demande et de signer la demande localement avec votre clé privée; rien de plus ne devrait être nécessaire. Mais certains s'en tirent simplement avec le secret de la demande. Ok, toute bonne API utilisera une sécurité de transport comme TLS (généralement via HTTPS). Mais vous exposez toujours votre clé privée au serveur de cette façon, ce qui augmente le risque qu'ils la gèrent d'une manière ou d'une autre (voir: le bogue de journalisation des mots de passe de GitHub et Twitter récemment découvert). Et HTTPS est théoriquement tout aussi sécurisé, mais il y a toujours des failles de mise en œuvre.
Mais beaucoup - en fait la plupart semble-t-il - les API vous permettent d'envoyer les deux clés dans les requêtes, car c'est plus facile que de faire faire leurs propres signatures; ne peut pas avoir d'exemples cURL purs autrement! Dans ce cas, il est inutile de les séparer. Je suppose que les clés séparées sont juste pour au cas où elles changeraient l'API plus tard pour en profiter. Ou certains ont une bibliothèque cliente qui pourrait le faire de la manière la plus sécurisée.
la source
Une chose que je n'ai pas vue mentionnée ici, bien que ce soit une extension de la réponse de Marcus Adams, est que vous ne devriez pas utiliser une seule information pour identifier et authentifier un utilisateur s'il y a une possibilité d' attaques chronométrées , ce qui peut utilisez les différences de temps de réponse pour deviner jusqu'où une comparaison de chaînes est arrivée.
Si vous utilisez un système qui utilise une «clé» pour rechercher l'utilisateur ou les informations d'identification, cette information peut être devinée progressivement au fil du temps en envoyant des milliers de requêtes et en examinant le temps nécessaire à votre base de données pour trouver (ou non trouver) un enregistrement. Ceci est particulièrement vrai si la "clé" est stockée en texte brut au lieu d'un hachage unidirectionnel de la clé. Vous voudrez stocker les clés des utilisateurs dans un texte brut ou crypté symétriquement si vous avez besoin de pouvoir afficher à nouveau la clé à l'utilisateur.
En ayant une deuxième information, ou "secret", vous pouvez d'abord rechercher l'utilisateur ou les informations d'identification à l'aide de la "clé", qui pourrait être vulnérable à une attaque de synchronisation, puis utiliser une fonction de comparaison sécurisée pour vérifier la valeur de le secret".
Voici l'implémentation de cette fonction par Python:
https://github.com/python/cpython/blob/cd8295ff758891f21084a6a5ad3403d35dda38f7/Modules/_operator.c#L727
Et il est exposé dans la
hmac
lib (et probablement dans d'autres):https://docs.python.org/3/library/hmac.html#hmac.compare_digest
Une chose à noter ici est que je ne pense pas que ce type d'attaque fonctionnera sur des valeurs qui sont hachées ou chiffrées avant la recherche, car les valeurs comparées changent de manière aléatoire chaque fois qu'un caractère de la chaîne d'entrée change. J'ai trouvé une bonne explication à cela ici .
Les solutions pour stocker les clés API seraient alors:
Parmi ceux-ci, je pense que 3 est le meilleur équilibre entre sécurité et commodité. J'ai vu cela mis en œuvre sur de nombreux sites Web lors de l'émission des clés.
J'invite également tous les experts en sécurité à critiquer cette réponse. Je voulais juste que cela soit un autre point de discussion.
la source