J'ai toujours utilisé une chaîne de sel par entrée appropriée lors du hachage des mots de passe pour le stockage de la base de données. Pour mes besoins, le stockage du 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 toujours construire une table arc-en-ciel en tenant compte d'une chaîne de sel particulière afin de casser un compte à la fois. Si ce compte a des privilèges d'administrateur, il n'a peut-être même pas besoin d'en casser d'autres.
Du point de vue de la sécurité, vaut-il la peine de stocker les sels dans un endroit différent? Considérez une application Web avec le code serveur et la base de données sur la même machine. 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 de sels le sera également.
Existe-t-il des solutions recommandées à cela?
Réponses:
Le but des tables arc-en-ciel est qu'elles sont créées à l'avance et distribuées en masse pour gagner du temps de calcul pour les autres - il faut autant de temps pour générer des tables arc-en-ciel à la volée que pour casser directement la combinaison mot de passe + sel (car efficacement ce qui est fait lors de la génération de tables arc-en-ciel pré-exécute les calculs de forçage brutal du hachage), ainsi l'argument selon lequel en connaissant le sel quelqu'un pourrait "générer une table arc-en-ciel" est faux.
Il n'y a aucun intérêt à stocker des sels dans un fichier séparé tant qu'ils sont par utilisateur - le but du sel est simplement de faire en sorte qu'une table arc-en-ciel ne puisse pas casser tous les mots de passe de la base de données.
la source
Je fournirai une interprétation légèrement différente à ce sujet.
Je stocke toujours le sel mélangé avec le hachage du mot de passe salé.
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 de sel et de mot de passe salé.
Ma justification de cette approche:
Si les données de mot de passe / de hachage sont compromises et tombent entre les mains d'un attaquant, l'attaquant ne saura pas ce qu'est le sel en regardant les données. De cette façon, un attaquant ne peut pratiquement pas effectuer une attaque par force brute pour obtenir un mot de passe correspondant au hachage, car il ne connaît pas le hachage pour commencer et n'a aucun moyen de savoir quelles parties des données sont des parties du sel, ou parties du hachage de mot de passe salé ( sauf s'il connaît la logique d'authentification de votre application ).
Si le hachage de mot de passe salé est stocké tel quel, une attaque par force brute peut être effectuée pour obtenir un mot de passe qui, lorsqu'il est salé et haché, produit les mêmes données que le hachage de mot de passe salé.
Cependant, par exemple, même si le hachage du mot de passe salé a été stocké tel quel, mais pré-suspendu avec un seul octet aléatoire, tant que l'attaquant ne sait pas que ce premier octet doit être rejeté, cela augmenterait également la difficulté d'attaque. Votre application devrait ignorer le premier octet des données lorsqu'elle est utilisée pour authentifier votre utilisateur.
La conclusion à cela ..
1) Ne stockez jamais les données que votre application d'authentification utilise sous leur forme exacte.
2) Si possible, gardez votre logique d'authentification secrète pour plus de sécurité.
Allez plus loin ..
Si vous ne pouvez pas garder secret la logique d'authentification de votre application - beaucoup de gens savent comment vos données sont stockées dans la base de données. Et supposez que vous avez décidé de stocker le hachage de mot de passe salé mélangé avec le sel, avec une partie du sel précédant le hachage de mot de passe salé et le reste du sel l'ajoutant.
Lors de la génération du sel aléatoire, vous pouvez également décider de manière aléatoire quelle proportion de votre sel vous stockerez avant / après le hachage du 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 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 du mot de passe salé, suivi du reste du sel.
Lors de l'authentification de la saisie du mot de passe d'un utilisateur, votre application passera sur la chaîne et supposera que le premier 1 octet des données est le premier 1 octet du sel, suivi du hachage salé. Cette passe échouera. L'application continuera en utilisant les 2 premiers octets des données comme les 2 premiers octets du sel et répétera jusqu'à ce qu'un résultat positif soit trouvé après avoir utilisé les 200 premiers octets comme les 200 premiers octets du sel. Si le mot de passe est incorrect, l'application continuera d'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 en connaissant la logique exacte. Des longueurs de sel accrues augmenteront encore la sécurité.
Les inconvénients de cette approche:
Étant donné que la logique exacte est déduite au moment de l'exécution, cette approche est très gourmande en ressources processeur. Plus la longueur du sel est longue, plus cette approche est gourmande en CPU.
L'authentification de mots de passe incorrects entraînera le coût le plus élevé du processeur. Cela peut être contre-productif pour les demandes 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 rendue encore plus sûre en utilisant des sels de largeur variable et / ou des hachages de mots de passe salés.
la source
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 - le point est d'utiliser un sel aléatoire pour chaque mot de passe afin qu'une seule table arc-en-ciel ne puisse pas être utilisée contre l'ensemble de vos hachages de mot de passe. Avec des sels aléatoires, un attaquant doit forcer chaque hachage séparément (ou calculer une table arc-en-ciel pour tous les sels possibles - beaucoup plus de travail).
Si vous aviez un emplacement de stockage plus sécurisé, il serait logique de simplement y stocker les hachages.
la source
Basé sur le livre Developing ASP.NET MVC 4 Web Applications de William Penberthy:
la source
L'utilité d'un sel est de rendre toutes les tables arc-en-ciel inutiles et d'exiger un nouvel ensemble d'entre elles. Il faut autant de temps pour deviner une chaîne que pour faire une table arc-en-ciel. 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, en457b 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 soit également.
la source