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
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
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?
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.
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.
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?
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 !
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.Est ce génant que la chaine que je génère ( de manière aléatoire ) apparaissent en clair dans mon registre ?
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.
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 :Est ce génant que mon mot de passe soit stocké en claire côté serveur?
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.
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?
Salut, je pense que c'est pas encore ca :
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.- utilisatuer renseigne la première fois son login et son mdp (+confirmation mdp)
- je stockes login et Hash1 = hash(login+mdp+salt1)
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.
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)
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?
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
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???
Le téléchargement de la mise à jour est fonction de l'état de la license de l'utilisateur.
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager