web-dev-qa-db-fra.com

Où stockez-vous vos chaînes de sel?

J'ai toujours utilisé une chaîne de sel par entrée appropriée lors du hachage de mots de passe pour le stockage de bases de données. Pour mes besoins, stocker le sel dans la base de données à côté du mot de passe haché a toujours bien fonctionné.

Cependant, certaines personnes recommandent que le sel soit stocké séparément de la base de données. Leur argument est que si la base de données est compromise, un attaquant peut quand même construire une table Rainbow prenant en compte une chaîne de sel particulière afin de craquer un compte à la fois. Si ce compte dispose de privilèges d’administrateur, il n’aura peut-être même pas besoin d’en craquer d’autres.

Du point de vue de la sécurité, vaut-il la peine de stocker les sels dans un endroit différent? Considérons une application Web avec le code serveur et la base de données sur le même ordinateur. Si les sels sont stockés dans un fichier plat sur cette machine, il est probable que si la base de données est compromise, le fichier sels le sera également.

Y at-il des solutions recommandées à cela?

241
friedo

Le point essentiel des tables Rainbow est qu’elles ont été créées à l’avance et distribuées en masse afin de gagner du temps de calcul pour d’autres. ce qui est effectivement fait lors de la génération de tables Rainbow pré-exécute les calculs pour forcer brutalement le hachage); ainsi, l'argument voulant que connaître le sel permet à quelqu'un de "générer une table Rainbow" est faux.

Il est inutile de stocker les sels dans un fichier séparé tant qu'ils sont par utilisateur. L'intérêt du sel est simplement de faire en sorte qu'une table Rainbow ne puisse pas casser tous les mots de passe de la base de données.

246
Amber

Je vais donner un point de vue légèrement différent à ce sujet.

Je stocke toujours le sel mélangé avec le hachage salted-password.

Par exemple, je placerai la première moitié du sel avant le hachage salé du mot de passe et la dernière moitié du sel après le hachage salé du mot de passe. L'application est consciente de cette conception et peut donc récupérer ces données et obtenir le hachage salt et salted-password.

Mon raisonnement pour cette approche:

Si le mot de passe/les données de hachage est compromis et tombe entre les mains d'un attaquant, celui-ci ne saura pas ce qu'est le sel en consultant les données. De cette manière, un attaquant ne peut pratiquement pas effectuer d'attaque par force brute pour obtenir un mot de passe correspondant au hachage, puisqu'il ne connaît pas le hachage et n'a aucun moyen de savoir quelles parties des données sont des parties du sel. parties du hachage salted-password ( à moins qu'il ne connaisse la logique d'authentification de votre application ).

Si le hachage de mot de passe salted est stocké tel quel, vous pouvez effectuer une attaque par force brute pour obtenir un mot de passe qui, une fois salé et haché, produit les mêmes données que le hachage de mot de passe salted.

Cependant, par exemple, même si le hachage salted-password était stocké tel quel, mais avec un seul octet aléatoire au préalable, tant que l'attaquant ignore que ce premier octet doit être supprimé, la difficulté augmente d'attaque. Votre application saura supprimer le premier octet des données lorsqu’elle est utilisée pour authentifier votre utilisateur.

La conclusion de ceci ..

1) Ne stockez jamais les données que votre application d'authentification utilise sous sa forme exacte.

2) Si possible, conservez le secret de votre logique d’authentification pour plus de sécurité.

Aller un peu plus loin ..

Si vous ne pouvez pas garder secrète la logique d'authentification de votre application, de nombreuses personnes savent comment vos données sont stockées dans la base de données. Et supposons que vous ayez décidé de stocker le hachage de mot de passe salé mélangé avec le sel, une partie du sel précédant le hachage de mot de passe salé et le reste du sel qui l’ajoute.

Lors de la génération du sel au hasard, vous pouvez également choisir au hasard quelle proportion de votre sel vous allez stocker avant/après le hachage de mot de passe salé.

Par exemple, vous générez un sel aléatoire de 512 octets. Vous ajoutez le sel à votre mot de passe et vous obtenez le hachage SHA-512 de votre mot de passe salé. Vous générez également un entier aléatoire 200. Vous stockez ensuite les 200 premiers octets du sel, suivis du hachage salted-password, suivis du reste du sel.

Lors de l'authentification du mot de passe d'un utilisateur, votre application passe sur la chaîne et suppose que le premier octet des données est le premier octet du sel, suivi du hachage salted. Cette passe va échouer. L'application continuera en utilisant les 2 premiers octets des données en tant que 2 premiers octets du sel, et répétez l'opération jusqu'à ce que vous obteniez un résultat positif après avoir utilisé les 200 premiers octets en tant que 200 premiers octets du sel. Si le mot de passe est erroné, l'application continuera à essayer toutes les permutations jusqu'à ce qu'aucune ne soit trouvée.

Les avantages de cette approche:

Sécurité accrue - même si votre logique d'authentification est connue, la logique exacte est inconnue au moment de la compilation. Il est pratiquement impossible d'effectuer une attaque par force brute, même avec la connaissance de la logique exacte. Des longueurs de sel augmentées augmenteront encore la sécurité.

Les inconvénients de cette approche:

Étant donné que la logique exacte est inférée au moment de l'exécution, cette approche consomme beaucoup de ressources processeur. Plus la longueur du sel est longue, plus cette approche demande beaucoup de temps au processeur.

L'authentification de mots de passe incorrects entraînera les coûts de processeur les plus élevés. Cela peut être contre-productif pour des requêtes légitimes, mais augmente la sécurité contre les attaquants.

Cette approche peut être mise en œuvre de différentes manières et peut être encore plus sécurisée en utilisant des sels à largeur variable et/ou des hachages salés avec un mot de passe.

33
Ibraheem

Souvent, ils sont ajoutés au hachage et stockés dans le même champ.

Il n'est pas nécessaire de les stocker séparément - il s'agit d'utiliser un sel aléatoire pour chaque mot de passe afin qu'une seule table Rainbow ne puisse pas être utilisée avec l'ensemble de vos hachages de mots de passe. Avec des sels aléatoires, un attaquant doit forcer brutalement chaque hachage séparément (ou calculer une table Rainbow pour tous les sels possibles - beaucoup plus de travail).

Si vous aviez un emplacement de stockage plus sécurisé, il serait logique de simplement stocker les hachages à cet endroit.

23
Andrew Medico

D'après le livre Developing ASP.NET MVC 4 Web Applications de William Penberthy:

  1. Pour avoir accès aux sels stockés dans une base de données séparée, les pirates doivent pirater deux bases de données différentes pour accéder au sel et au mot de passe salé. Les stocker dans la même table que le mot de passe, voire dans une autre table de la même base de données, signifierait que lorsque les pirates informatiques auront accès à la base de données, ils auront accès à la fois au hachage salt et au mot de passe. Comme la sécurité implique de rendre le piratage dans le système trop coûteux ou trop long pour en valoir la peine, doubler la quantité d'accès qu'un pirate informatique devrait obtenir devrait rendre le système plus sécurisé.
  2. La facilité d'utilisation est la principale raison de conserver les sels dans la même base de données que les mots de passe hachés. Vous n'avez pas à vous assurer que deux bases de données sont toujours disponibles en même temps et toujours synchronisées. L’avantage d’avoir un sel est minime si chaque utilisateur a un sel randomisé car bien que cela puisse faciliter la découverte du mot de passe d’un individu, la force nécessaire pour déchiffrer les mots de passe du système sera généralement élevée. À ce niveau de discussion, c’est vraiment ce à quoi on s’attend: protéger les mots de passe. Si les pirates ont acquis une copie de la base de données, les données de votre application sont déjà compromises. À ce stade, le problème consiste à atténuer les risques des utilisateurs en raison du potentiel de mots de passe partagés.
  3. L'obligation de maintenir deux bases de données liées distinctes est importante. Certes, cela ajoute une perception de sécurité, mais le seul avantage que cela donne est qu’il protège un mot de passe, un élément de données unique. Si chaque champ de la base de données était crypté individuellement et que le même sel était utilisé à cet effet, il serait plus logique de le stocker séparément des données, car la sécurité de base de votre système est améliorée.
4
DaNeSh

L'intérêt d'un sel est de rendre toutes les tables Rainbow inutiles et de nécessiter la création d'un nouvel ensemble. Il faut autant de temps pour deviner une chaîne que pour créer une table Rainbow. Par exemple, le hachage SHA-256 de "mot de passe" est 5e88 4898 da28 0471 51d0 e56f 8dc6 2927 7360 3d0d 6aab bdd6 2a11 ef72 1d15 42d8. Après l'ajout d'un sel, tel que "badpassword", la nouvelle chaîne à hacher est "passwordbadpassword" qui, en raison de l'effet d'avalanche, modifie considérablement la sortie en 457b f8b5 37f1 802e f9c8 2e46 b8d3 f8b5 721b 7cbb d485 f0bb e523 bfbe 73e6 58d6.

Normalement, le sel est simplement stocké dans la même base de données que le mot de passe, également parce que si une base de données est piratée, il est probable que l'autre le sera également.

0
Eric Jin