web-dev-qa-db-fra.com

Dois-je hacher ou chiffrer des clés d'API avant de les stocker dans une base de données?

Je sécurise les appels d'API à un service REST que je crée à l'aide de clés API. Le plan consiste à:

  1. Lorsque nous obtenons un nouveau client, générez une clé API (un UUID).
  2. Envoyez-leur la clé API par e-mail.
  3. Ils envoient la clé API à chaque appel à notre service (via HTTPS). Nous allons rechercher la clé API dans notre base de données (en la chiffrant ou en la hachant d'abord) et déterminer le compte auquel la clé API est destinée.

Finalement, nous ajouterons des comptes d'utilisateurs et un portail pour tout cela afin que les clients puissent générer et désactiver des clés d'API sans que nous ayons besoin d'être impliqués.

Ma question porte sur la dernière partie. Dois-je hacher ou chiffrer (ou laisser non chiffré?) Les clés API avant de les stocker dans la base de données? J'essaie de comprendre les implications. Je sais que si je les hache, je me protège contre quelqu'un qui connaît toutes les clés API s'il obtient un accès DB. Mais à quoi dois-je penser? Par exemple, y a-t-il des raisons de performance pour faire l'un sur l'autre?

6
Daniel Hipke

Oui, vous devez absolument hacher vos clés API. En effet, ce sont vos mots de passe et doivent être traités comme tels. Et notez que c'est haché - non crypté. Vous n'avez jamais besoin de déchiffrer les clés API, vous ne devriez donc pas pouvoir le faire.

Comme saghaulor le dit, vous devez vous assurer que vous utilisez un UUID de la version 4 (aléatoire, c'est-à-dire) et que vous utilisez une source aléatoire aléatoire cryptographiquement lors de leur génération. Puisqu'un UUID correctement généré contient 122 bits d'entropie vous n'avez pas à vous soucier du salage ou de l'utilisation d'une fonction de hachage lente comme bcrypt. Un seul tour de SHA-256 serait suffisant.

Une partie problématique de votre conception est que vous donnez aux utilisateurs des "mots de passe" qui sont livrés par courrier et qu'ils ne peuvent pas changer. Cela peut ne pas être suffisant pour les utilisateurs soucieux de la sécurité. Le portail que vous mentionnez résoudra peut-être ce problème.

8
Anders

1) Assurez-vous que vous utilisez un générateur aléatoire sécurisé pour générer votre UUID.

2) N'envoyez pas la clé API par e-mail. Le courrier électronique n'a aucune garantie de transport sécurisé, c'est-à-dire que vous envoyez probablement la clé en clair.

3) La façon dont vous implémentez le mécanisme d'authentification affectera la façon dont vous pouvez stocker la clé API.

Si vous allez utiliser la clé API comme clé primaire, vous ne pouvez pas la hacher ou la crypter, car la recherche est effectivement impossible si vous avez haché ou chiffré correctement.

Si vous fournissez à l'utilisateur une combinaison de clé primaire et de clé API, vous pouvez alors stocker la clé API en toute sécurité. Étant donné que la clé est effectivement un mot de passe, le hachage doit être suffisant et est recommandé.

N'oubliez pas d'utiliser l'algorithme correctement. Généralement, le hachage nécessite un sel pour chaque enregistrement. Il existe différents algorithmes de hachage. Certains, comme bcrypt et scrypt, peuvent ajouter une latence artificielle pour ralentir le forçage brut. Cela peut ou non convenir à votre cas d'utilisation. Certains algorithmes ne sont pas recommandés, tels que MD5 et SHA1 car ils se sont révélés non sécurisés.

Vous pouvez hacher la clé sans sel et vous pouvez ensuite effectuer des recherches simples. Ce ne sera pas aussi sûr que le hachage avec du sel, mais la sécurité de cette approche peut être suffisante pour vos besoins.

1
saghaulor