Comment afficher un mot de passe en étoiles dans un programmeC ?
Résolu/Fermé
anonyme9955
Messages postés
20
Date d'inscription
dimanche 19 juin 2016
Statut
Membre
Dernière intervention
7 octobre 2018
-
Modifié par baladur13 le 13/07/2016 à 11:05
anonyme9955 Messages postés 20 Date d'inscription dimanche 19 juin 2016 Statut Membre Dernière intervention 7 octobre 2018 - 17 mars 2017 à 18:01
anonyme9955 Messages postés 20 Date d'inscription dimanche 19 juin 2016 Statut Membre Dernière intervention 7 octobre 2018 - 17 mars 2017 à 18:01
A voir également:
- Afficher un mot de passe caché par des étoiles android
- Voir mot de passe wifi android - Guide
- Trousseau mot de passe iphone - Guide
- Mot de passe administrateur - Guide
- Identifiant et mot de passe - Guide
- Mettre un mot de passe sur un dossier - Guide
3 réponses
paly2
Messages postés
254
Date d'inscription
vendredi 29 août 2014
Statut
Membre
Dernière intervention
15 février 2018
25
Modifié par paly2 le 2/07/2016 à 17:23
Modifié par paly2 le 2/07/2016 à 17:23
Il n'existe pas de fonction standard pour faire cela. Tout dépend donc de ta plateforme.
Sous windows, après recherche, la fonction getch() devrait faire l'affaire (le code suivant n'est pas testé) :
Selon la doc, la fonction getch() récupère un caractère sans l'afficher. Et ensuite c'est nous qui affichons l'astérisque.
Pour GNU/Linux, à la place de conio.h, on peut modifier les attributs du terminal avec termios.h. Le code suivant est testé et fonctionne:
Dans ce code, on modifie les attributs du terminal pour enlever l'affichage des caractères saisis, on lit avec read(). Si c'est un caractère normal, on affiche une astérisque. On supporte aussi les backspaces (touche "retour arrière"), ce que ne fait pas le code avec getch() plus haut.
Si tu veux un code qui fonctionne sous les deux OS, tu peux utiliser les directives de préprocesseur:
Note: hardcoder le mot de passe dans l'exécutable n'est vraiment pas une bonne idée niveau sécurité, si quelqu'un jette un oeil à l'intérieur de l'exécutable il le verra, sans aucune connaissance particulière.
Ici sous GNU/Linux, ton programme compilé avec GCC, l'exécutable ouvert avec gedit:
Il vaut mieux utiliser des techniques de chiffrement à la place, il en existe pleins.
La curiosité est une excellente qualité !
Sous windows, après recherche, la fonction getch() devrait faire l'affaire (le code suivant n'est pas testé) :
#include <conio.h> // header non standard, existe uniquement sous Windows. #include <stdio.h> int main(void) { char c, mot_de_passe[256] = ""; int i = 0; while ((c=getch()) != '\n' && i < 255) { mot_de_pass[i] = c; printf("*"); i++; } mot_de_passe[i] = '\0'; printf("Le mot de passe est: %s\n", mot_de_passe); return 0; }
Selon la doc, la fonction getch() récupère un caractère sans l'afficher. Et ensuite c'est nous qui affichons l'astérisque.
Pour GNU/Linux, à la place de conio.h, on peut modifier les attributs du terminal avec termios.h. Le code suivant est testé et fonctionne:
#include <stdio.h> #include <termios.h> // header non standard, existe uniquement sous les systèmes POSIX int main(void) { char mot_de_passe[256] = ""; char c = 0; char *x = mot_de_passe; struct termios argin, argout; tcgetattr(0,&argin); argout = argin; argout.c_lflag &= ~(ICANON|ECHO); argout.c_iflag &= ~(ICRNL); argout.c_oflag &= ~(OPOST); argout.c_cc[VMIN] = 1; argout.c_cc[VTIME] = 0; tcsetattr(0,TCSADRAIN,&argout); do { if (read(0, &c, 1) != 1) continue; if (c == 0x0d) break; if ((c == 0x08) || (c == 0x7f)) { // backspace putchar(8); putchar(' '); putchar(8); x--; } else { *x++ = c; putchar('*'); } fflush(stdout); } while (x-mot_de_passe < 255); *x = '\0'; tcsetattr(0,TCSADRAIN,&argin); printf("Le mot de passe est: %s\n", mot_de_passe); return 0; }
Dans ce code, on modifie les attributs du terminal pour enlever l'affichage des caractères saisis, on lit avec read(). Si c'est un caractère normal, on affiche une astérisque. On supporte aussi les backspaces (touche "retour arrière"), ce que ne fait pas le code avec getch() plus haut.
Si tu veux un code qui fonctionne sous les deux OS, tu peux utiliser les directives de préprocesseur:
#ifdef WIN32 /* code pour Windows */ #elif defined(linux) /* code pour GNU/Linux */ #else #error Votre systeme d'exploitation n'est pas supporte. #endif
Note: hardcoder le mot de passe dans l'exécutable n'est vraiment pas une bonne idée niveau sécurité, si quelqu'un jette un oeil à l'intérieur de l'exécutable il le verra, sans aucune connaissance particulière.
Ici sous GNU/Linux, ton programme compilé avec GCC, l'exécutable ouvert avec gedit:
Il vaut mieux utiliser des techniques de chiffrement à la place, il en existe pleins.
La curiosité est une excellente qualité !
6 juil. 2016 à 10:36
Je suis désolé de vous demander ça en plus, mais pourriez-vous essayer d'intégrer ce bout de code au mien??
Merci d'avance!
Modifié par Anonyme9955 le 6/07/2016 à 11:19
<code c>
#include <conio.h>
#include <stdio.h>
int main(void) {
char c, mot_de_passe[256] = "";
int i = 0;
while ((c=getch()) != '\n' && i < 255) {
mot_de_passe[i] = c;
printf("*");
i++;
}
mot_de_passe[i] = '\0';
printf("Le mot de passe est: %s\n", mot_de_passe);
return 0;
}
<code>
Cela marche bien, sauf que quand j'appuie sur enter, cela affiche également une étoile!
J'aimerais pouvoir interrompre sans avoir a couper le programme.
As-tu une solution?
PS: la balise <code c> ne marche pas. pourquoi?