IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Sécurité Discussion :

Stockage password dans la base de registre


Sujet :

Sécurité

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 57
    Points : 37
    Points
    37
    Par défaut Stockage password dans la base de registre
    Bonjour,
    Pour une application, j'ai besoin de stocker un login et un mot de passe dans le registre. J'ai trouvé une explication du principe mais je voudrais savoir comment on fait en pratique.

    Pour info, je bosse en C#.

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Points : 1 111
    Points
    1 111
    Par défaut
    Le lien que tu donnes décrit effectivement la manière de stocker un mot de passe pour que ce soit sécurisé.

    Si tu veux savoir comment écrire des clefs de registre en C#, va voir sur le forum C#.

    Si ce n'est pas la question, reformule de facon plus claire ce que tu ne comprends pas :
    - comment on cree un hash?
    - comment on vérifie le mot de passe?
    - autre?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Pour écrire dans le registre ya pas de problème, c'est plus sur la manière en pratique de gérer le hash+salt et la vérification derrière avec ce qui est stocké dans ma DB.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Points : 1 111
    Points
    1 111
    Par défaut
    http://www.obviex.com/samples/hash.aspx

    En gros tu dois concatener des chaines de caracteres a ton mot de passe avant de le hasher et le stocker, et ce avec un une chaine de caractere unique pour chaque utilisateur.

    tu fais donc une string qui contient ton mot de passe plus un salt unique que tu generes aleatoirement, et tu fais le hash sur cette chaine de caractere :
    monhash = hash (password + randomstring).
    ensuite tu concatenes ta chaine aleatoire a ton hash :
    astocker = monhash + randomstring.
    et tu stockes cette valeur dans ton registre.

    Pour vérifier le mot de passe user :
    tu connais monhash et randomstring, puisque tu les relis dans la base de registre.
    tu testes le mot de passe rentré par l utilisateur avec la condition :
    hash (motdepasseatester + randomstring) = monhash.
    Si les 2 sont egaux, tu as le bon mot de passe, sinon, le mot de passe n'est pas le bon.

    Note : cela ne rend pas ton mot de passe invulnérable mais ca rend la recherche de mot de passe suffisamment longue et pénible.

    Tu peux rajouter des artifices basiques du genre couper ton mot de passe : par exemple si ton mot de passe c'est azerty, tu peux faire un hash( aze + salt + rty ), ca fait que meme si ton md5 est craqué, si le pirate ne sait pas comment tu as codé ton hash il ne pourra pas trouver le mot de passe.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    ok, merci pour l'explication.
    Je bosse sur une application client serveur. Lorsque l'utilisateur entre son login et mot de passe dans l'interface client, je stocke donc le login (en clair) dans le registre windows et je stocke le hash(cuisine avec le login, le password et le salt) que je concatène avec le salt. Est ce génant que la chaine que je génère ( de manière aléatoire ) apparaissenten clair dans mon registre ? ex : 97355623df738b9a3f876e6b1cca40d5mzml5497 (hash + salt)

    D'autre part pour identifier mon utilisateur j'envoie au serveur le login et le hash+salt qui sont stockés dans le registre, coté serveur je recalcule le hash avec le salt, le login et le mot de passe qui eux sont stockées en claire dans une database coté serveur et je compare ce hash avec celui qui est dans mon registre. Est ce génant que mon mot de passe soit stocké en claire côté serveur?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Points : 1 111
    Points
    1 111
    Par défaut
    Avant de répondre a tes questions il y a quelque chose qui me choque dans ce que tu fais : si tu stockes dans ton registre les infos que tu envoies pour t'authentifier, peu importe les sécurités que tu mettras en place par derrière, il suffira de copier tes clefs de registre pour avoir l'authentification sur le serveur !!!

    Soit tu t'authentifie sur le serveur et les infos de login/mdp sont stockés sur le serveur, soit tu t'authentifie sur la machine locale, et les infos de login/mdp peuvent etre stockées dans le registre.

    mais si tu t'authentifie sur un serveur tu n'as aucune raison valable de stocker quoi que ce soit dans le registre !

    Est ce génant que la chaine que je génère ( de manière aléatoire ) apparaissent en clair dans mon registre ?
    Oui et non, je dirais que c'est assez standard comme manière de fonctionner, ca permet déjà une sécurité d'un bon niveau.

    Il faut bien se rendre compte que la sécurité parfaite ca n'existe pas .Je te donne en exemple windows, il y a des certainement des ingenieurs qui bossent a plein temps pour sécuriser le stockage de mots de passe et pourtant les cracker trouvent toujours un moyen de creer des outils de crack, le seul truc c'est que ca doit etre suffisamment penible et long de retrouver un mot de passe compliqué.

    Dans le cas d'un mot de passe avec salt, on va dire qu'on a atteint l'objectif "ce sera penible et long de retrouver le mot de passe", maintenant si la CIA a accès a ton hash et veut retrouver le mot de passe c'est sur que ca lui prendra pas longtemps.

    par contre cela suppose un accès au hash, et si toi tu fais une application sur ton serveur, alors surtout ne stocke aucune info en local, met tout sur ton serveur. et sans accès au serveur, personne ne pourra rien faire pour cracker tes mots de passe.

    note que le salt ne sert qu'a une seule chose : rendre difficile l'opération "je retrouve le mot de passe alors que j'ai deja le hash". sans salt, c'est simple. avec salt c'est dur.

    Est ce génant que mon mot de passe soit stocké en claire côté serveur?
    Oui oui oui, ca c'est genant, ton mot de passe ne doit etre en clair nulle part. Surtout que c'est completement inutile dans une authentification serveur, voila comment ca marche :

    hash : stocké coté serveur
    salt : stocké coté serveur
    coté utilisateur : rien de stocké

    exemple de procedure d'authentification :
    utilisateur rentre login/mdp.
    programme : demande au serveur le salt correspondant au login
    programme : calcule le hash(password+salt)
    programme : envoie le hash au serveur
    serveur : compare hash envoyé par le programme et le hash en database
    si ils sont egaux : authentification réussie
    sinon : authentification ratée.

    NOTE : les connexions réseau doivent etre sécurisées.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Merci beaucoup pour toutes ces explications. C'est la première fois que j'ai à gérer une identification dans une application.

    En m'inspirant de tes conseil, j'ai modifié mon programme et du coup :

    - utilisatuer renseigne la première fois son login et son mdp (+confirmation mdp)
    - je stockes login et Hash1 = hash(login+mdp+salt1)
    - j'envois login et Hash1 au serveur qui stocke login et Hash2 = (Hash1 + salt2) et salt2

    Donc pour l'identification du coup je fais bien :
    - demande du salt2, relatif au login, au serveur
    - coté client je calcule Hash3 = hash(Hash1+salt2)
    - envoie Hash3 au serveur qui compare Hash3 et Hash2

    C'est vrai que du coup le mot de passe n'apparait nul part.

    ça te semble bon maintenant?

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Points : 1 111
    Points
    1 111
    Par défaut
    Salut, je pense que c'est pas encore ca :

    - utilisatuer renseigne la première fois son login et son mdp (+confirmation mdp)
    - je stockes login et Hash1 = hash(login+mdp+salt1)
    non tu ne stockes pas pas login et hash1, tu les envoie au serveur qui les stocke dans la base de donnée. Comme je te l'ai dit, tu ne stockes absolument rien en local.



    du coup la procedure d'authentification devient :
    -demande de salt1 au serveur
    -coté client tu calcules hash_a_tester=hash(motdepasse_rentré_par_lutilisateur + salt1)
    -tu envoies hash_a_tester au serveur qui le compare a hash1.

    Ce que tu sembles ne pas comprendre, c'est que pour l'authentification, le programme ne ressort pas une valeur stockée, il recalcule intégralement le hash a partir du mot de passe entré par l'utilisateur.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Le soucis c'est que j'ai besoin que mon programme fasse des requêtes automatiques au serveur sans que l'utilisateur n'ait besoin de rentrer à chaque fois son login et son mdp.
    C'est une application de type update manager. Genre à intervalle de temps régulier le programme demande à mon serveur si pour un utilisateur donnée, une mise à jour de son logiciel est diponible (vérification de l'utilisateur et de la validité de sa license)

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Points : 1 111
    Points
    1 111
    Par défaut
    Ok, on a peut etre jsute un probleme de compréhension : quand tu dis stocker, moi je comprenais stocker dans un fichier ou dans une clef de registre, ce qu'il ne faut pas faire.
    Par contre le stocker en mémoire dans une variable, pendant que le programme est en train de s'executer, là oui, ca me parait correct.

    L'utilisateur se "logge" sur le serveur a chaque nouvelle execution du programme, ca parait logique, c'est bien comme ca que ca marche?

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    C'est ça en quelque sorte. Le programme se lance au démarrage de windows et tourne en permanence en tache de fond (while (true)...) et tous les jours, semaine ou mois il checke sur le serveur si une MAJ est dispo pour l'utilisateur

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Points : 1 111
    Points
    1 111
    Par défaut
    Mais pourquoi avoir besoin d'une authentification dans ce cas?
    c'est super lourd si tu rentrer un mot de passe pour ca a chaque nouvelle session windows.


    Si c'est une question de licence le plus simple c'est pas de vérifier la license lors de l'installation de la mise a jour???

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Le téléchargement de la mise à jour est fonction de l'état de la license de l'utilisateur.

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Points : 1 111
    Points
    1 111
    Par défaut
    Alors je suis convaincu que tu fais un mauvais choix de chercher a authentifier.

    ->tu stockes l'info sur la mise a jour a recevoir dans le registre.
    ->tu telecharges la mise a jour en fonction de cette clé stockée.

    -> pour eviter le piratage, tu fais, dans ton executable de mise a jour, une vérification de la license pour savoir si le client y a droit.

    Est ce que tu connais des programmes d'update automatique qui demandent de s'authentifier? moi pas. Tous les logiciels que je connais vérifient une eventuelle license lors de l'execution de la mise a jour. Et si tout le monde fait comme ca, c'est surement pas pour rien.

Discussions similaires

  1. [VB6]ecrire une chaine de byte dans la base de registre
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 17/12/2008, 10h50
  2. Probleme ecriture dans la base de registre
    Par Deton@tor dans le forum C++Builder
    Réponses: 8
    Dernier message: 30/04/2008, 15h03
  3. Réponses: 18
    Dernier message: 30/09/2005, 09h30
  4. Réponses: 16
    Dernier message: 22/03/2005, 21h57
  5. Impossible d'inscrire un ocx dans la base de registre
    Par tomtom7 dans le forum Windows XP
    Réponses: 4
    Dernier message: 31/01/2005, 09h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo