Question

Quelle est la meilleure façon de gérer la gestion des comptes d'utilisateurs dans un système, sans que vos employés ayant accès à une base de données aient accès aux comptes.

Exemples:

  1. Stockage du nom d'utilisateur/mot de passe dans la base de données.C'est une mauvaise idée car toute personne ayant accès à une base de données peut voir le nom d'utilisateur et le mot de passe.Et donc utilisez-le.

  2. Stockage du hachage du nom d'utilisateur/mot de passe.Il s'agit d'une meilleure méthode, mais le compte est accessible en remplaçant le hachage du mot de passe dans la base de données par le hachage d'un autre compte dont vous connaissez les informations d'authentification.Ensuite, une fois l'accès accordé, rétablissez-le dans la base de données.

Comment Windows/*Nix gère-t-il cela ?

Était-ce utile?

La solution

Il s'agissait d'un problème courant sous UNIX il y a de nombreuses années et a été résolu en séparant les composants d'identité de l'utilisateur (nom d'utilisateur, UID, shell, nom complet, etc.) des composants d'authentification (hachage de mot de passe, sel de hachage de mot de passe).Les composants d'identité peuvent être globalement lisibles (et doivent en fait l'être si les UID doivent être mappés aux noms d'utilisateur), mais les composants d'authentification doit rester inaccessible aux utilisateurs.Pour authentifier un utilisateur, disposez d'un système de confiance qui acceptera un nom d'utilisateur et un mot de passe et renverra un simple résultat « authentifié » ou « non authentifié ».Ce système doit être la seule application ayant accès à la base de données d'authentification et doit attendre un temps aléatoire (peut-être entre 0,1 et 3 secondes) avant de répondre pour éviter les attaques de synchronisation.

Autres conseils

Il s'agit d'une meilleure méthode, mais le compte est accessible en remplaçant le hachage du mot de passe dans la base de données par le hachage d'un autre compte dont vous connaissez les informations d'authentification.

Il n'y a vraiment aucun moyen de contourner ce problème.Toute personne ayant accès en écriture au fichier de mots de passe a le contrôle total de l'ordinateur.

J'en choisirais 2 mais j'utiliserais du sel.Un pseudocode :

SetPassword(user, password)
    salt = RandomString()
    hash = Hashfunction(salt+password)
    StoreInDatabase(user, salt, hash)

CheckPassword(user, password)
    (salt, hash) = GetFromDatabase(user)
    if Hashfunction(salt+password) == hash
        return "Success"
    else
        return "Login Failed"

Il est important d'utiliser une fonction de hachage bien connue (telle que MD5 ou SHA-1), implémentée dans une bibliothèque. Ne lancez pas le vôtre et n'essayez pas de l'implémenter à partir d'un livre cela ne vaut tout simplement pas le risque de se tromper.

@Brian R.Bondy :La raison pour laquelle vous utilisez du sel est de rendre les attaques de dictionnaire plus difficiles, l'attaquant ne peut pas hacher un dictionnaire et essayer tous les mots de passe, mais il doit plutôt prendre le sel + le dictionnaire et le hacher, ce qui fait exploser les exigences de stockage.Si vous avez un dictionnaire des 1000 mots de passe les plus courants et que vous les hachez, vous avez besoin de quelque chose comme 16 Ko, mais si vous ajoutez deux lettres aléatoires, vous obtenez 62*62*16 Ko ≈ 62 Mo.

Sinon, vous pourriez utiliser une sorte de Mots de passe à usage unique J'ai entendu de bonnes choses à propos d'OTPW mais je ne l'ai pas utilisé.

Jeff Atwood a quelques bons articles concernant le hachage, si vous décidez d'emprunter cette voie :

Vous pouvez utiliser openID et n’enregistrer aucun mot de passe utilisateur confidentiel.Qui a dit que c'était réservé aux sites Web ?

  1. Une très mauvaise idée en effet.Si la base de données est compromise, tous les comptes sont compromis.
  2. Bonne façon de procéder.Si votre algorithme de hachage inclut le nom d'utilisateur, remplacer le hachage du mot de passe par un autre ne fonctionnera pas.

Unix stocke les hachages dans un fichier texte /etc/shadow, accessible uniquement aux utilisateurs privilégiés.Les mots de passe sont cryptés avec un sel.

Vous pourriez stocker le sel pour le mot de passe haché dans une autre table, bien sûr, chaque utilisateur aurait son propre sel.Vous pouvez alors limiter l'accès à cette table.

L'approche habituelle consiste à utiliser la deuxième option avec le courrier électronique :

Stockez le nom d’utilisateur, le hachage du mot de passe et l’adresse e-mail dans la base de données.

Les utilisateurs peuvent soit saisir leur mot de passe, soit le réinitialiser. Dans ce dernier cas, un mot de passe aléatoire est généré, un nouveau hachage est créé pour l'utilisateur et le mot de passe lui est envoyé par e-mail.

Modifier:Si la base de données est compromise, vous pouvez seulement garantir qu'aucune information sensible ne sera accessible, vous ne pouvez plus assurer la sécurité de votre application.

Hachez le nom d'utilisateur et le mot de passe ensemble.De cette façon, si deux utilisateurs ont le même mot de passe, les hachages seront toujours différents.

Ce n'est pas un problème pour de nombreuses applications, car accéder à la base de données est probablement l'objectif le plus courant de tout attaquant.Alors s’ils ont déjà accès à la base de données, pourquoi voudraient-ils quand même se connecter à l’application ?:)

Si le « système » est un site Web public RPX peut vous fournir des services de connexion/compte utilisateur pour les fournisseurs les plus courants, comme OpenId, Facebook, Google, etc.

Maintenant, étant donné la façon dont vous formulez votre question, je suppose que le « système » dont vous parlez est plus probablement une application d'entreprise interne basée sur Windows/Linux.Néanmoins;pour ceux qui recherchent sur Google des fournisseurs de connexion/compte utilisateur (comme je le faisais avant de tomber sur RPX), cela pourrait être une bonne solution :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top