web-dev-qa-db-fra.com

Utiliser deux sels pour l'authentification de l'utilisateur?

Lorsque vous stockez les informations d'identification de l'utilisateur dans une base de données, nous savons tous que le hachage du mot de passe est le strict minimum, mais il est préférable de le saler avant le hachage. Le sel doit être généré de manière aléatoire, suffisamment long et unique pour chaque utilisateur.

Je me souviens d'avoir lu quelque part (mais je ne me souviens plus où) un article sur l'utilisation de deux sels (tous deux suffisamment longs et générés aléatoirement):

  1. Un sel global
  2. Un sel unique par entrée

Le hachage résultant serait: hash(globalSalt + password + uniqueSalt) (l'ordre de concaténation n'est pas vraiment important).

Y a-t-il une raison pour laquelle cela serait plus sûr que d'avoir simplement un sel unique par entrée? Nous supposons que l'attaquant a accès aux fichiers de code où le sel global est stocké.

6
Wookai

J'ai écrit une réponse, puis lu un peu plus, et modifié ma réponse de manière substantielle. Cette question a déjà été débattue sur Stack Overflow. Le réponse acceptée sur cette question est un bon point de départ, suivez les liens.

Ma prise est que:

Le sel statique (que vous appelez global) a une certaine valeur, car:

  • Il est simple à mettre en œuvre et ne nécessite pas de recherche de base de données au moment de l’exécution, c’est-à-dire qu’il est facile à faire évoluer.
  • Ce sel est statique et peut être stocké en tant que constante globale dans le code de l'application ou lu à partir d'un fichier INI. De cette façon, avoir accès à la base de données (attaque par injection SQL par exemple) ne révèle pas nécessairement ce sel.

Le sel par mot de passe est important pour les raisons suivantes:

  • Il s'agit d'une chaîne aléatoire unique pour chaque mot de passe, générée côté serveur et stockée en texte brut dans la base de données. Pour N mots de passe, cela rend effectivement la totalité de la recherche d'un table Rainbow attacher N x N. Cela ne peut pas être attaqué efficacement par les tables Rainbow pré-calculées aujourd'hui en raison de la taille même de l'ensemble de données.

Un autre conseil utile que j'ai appris des discussions sur le dépassement de pile est le cryptage du nom d'utilisateur si possible. Je n'y avais pas vraiment pensé, mais cela a du bon sens dans certains scénarios.

EDIT: Veuillez lire l'excellent article "Assez avec les tables arc-en-ciel: Ce que vous devez savoir sur les systèmes de mots de passe sécurisés" . La majeure partie de ce qui est dit sur le hachage du mot de passe est erronée, y compris l'approche "MD5/SHA256 avec sel" utilisée si souvent

8
Jesper Mortensen

Ceci a déjà été posé à StackOverflow: Double-sel pour les mots de passe de hachage?

4
John Conde

Je viens de lire cette question et elle m'a rappelé une question que j'ai posée sur SO il y a environ un an: informations complètes sur les sels de hachage . Vous voudrez peut-être relire la question et ses réponses car elle contient d'autres informations qui pourraient être très utiles à quiconque souhaite en savoir plus sur le hachage.

Je dois également noter que la mise en œuvre de l’authentification des utilisateurs en général n’est pas une chose à laquelle vous voulez vraiment vous attaquer par vous-même si vous pouvez l’éviter. Rappelez-vous toujours Ne réinventez pas la roue, sauf si vous envisagez d'en apprendre davantage sur les roues .

1
evolve