Forum: PC-Programmierung C Passwortabfrage (aus Youtube-Video)


von Bartosz B. (bartosz)


Lesenswert?

Hallo zusammen,

ich habe 1:1 dieses Youtube-Video nachgeschrieben und dachte erst, dass 
es eine Sache von ner Viertelstunde sei. Doch mein System spielt mir 
einen Streich...

https://www.youtube.com/watch?v=EEmAAgOjDFg

Bei mir liest getch() nach dem eigentlichen Buchstaben zusätzlich '\0' 
ein, sodass die while-Schleife ein 2. Mal durchläuft, sodass ein 2.Mal 
ein * geprintet wird und sodass der String nicht länger wird!

Was läuft hier schief?

PS: ich habe seine Steuerzeichen durch '\r' ersetzt, finde ich schöner.
1
bool Passwortabfrage(string richtigesPasswort)
2
{
3
  char einZeichen; //letztes, eingegebenes Zeichen
4
  string ganzesPasswort;
5
  einZeichen = getch();
6
7
  while (einZeichen != '\r')  //solange nicht ENTER...
8
  {
9
    if (einZeichen != '\b') //wenn nicht BACKSPACE...
10
    {
11
      ganzesPasswort = ganzesPasswort + einZeichen;
12
      putch('*');
13
    }
14
    else if (einZeichen == '\b' && ganzesPasswort.length() > 0)
15
    {
16
      ganzesPasswort.resize(ganzesPasswort.length() - 1);
17
      putch('\b');  //Cursor nach links
18
      putch(' ');  //überschreiben
19
      putch('\b'); //wieder auf Leerzeichen draufspringen
20
    }
21
    einZeichen = getch();
22
  }
23
24
  if (ganzesPasswort == richtigesPasswort)
25
  {
26
    return true;
27
  }
28
  else
29
  {
30
    return false;
31
  }
32
}
33
34
35
*In der main*
36
37
for (int i = 0; i <= 2; i++)
38
  {
39
    printf("Passwort: ");
40
    if (Passwortabfrage("hallo Welt"))
41
    {
42
      printf("\nOK\n");
43
      break;      //aus for-Schleife raus
44
    }
45
    else
46
    {
47
      Beep(500, 500);
48
      Beep(300, 500);
49
      printf("Passwort ist falsch!\n");
50
    }
51
  }

: Verschoben durch User
von foobar (Gast)


Lesenswert?

> Doch mein System spielt mir einen Streich...

Du solltest das System nennen, denn üblich ist dieses Verhalten nicht.

von Bartosz B. (bartosz)


Lesenswert?

foobar schrieb:
>> Doch mein System spielt mir einen Streich...
>
> Du solltest das System nennen, denn üblich ist dieses Verhalten nicht.

Windows 8
Entwicklungsumgebung ist Visual Studio Community

von foobar (Gast)


Lesenswert?


von foobar (Gast)


Lesenswert?

s/Windows/C-Runtime/

von Bartosz B. (bartosz)


Lesenswert?

Danke dir!
mit _getwch() funktioniert alles. Hab's gerade mit richtigem und 
falschem Passwort getestet.

von DPA (Gast)


Lesenswert?

Bartosz B. schrieb:
> mit _getwch() funktioniert alles.

_getwch ist eine Windowsspezifische non-standard funktion, selbes gillt 
für _getch. Und getch ist normalerweise eine curses funktion, curses ist 
eine Library für Konsolenprogramme. Die Standardfunktion im c standard 
zum Lesen eines Zeichens ist getchar. Alternativ kann man auch getc und 
fread nutzen. Auf POSIX compatiblen systemen ist ausserdem die 
Verwendung von "read" möglich. Wenn man mit diesen ein Passwort einlesen 
will, sollte man aber erst das terminal echo ausschalten. Auf posix 
systemen macht man das über das ECHO flag mit tcsetattr (termios). 
Ausserdem sollte aus Sicherheitsgründen wenn möglich nicht von stdin, 
sondern vom controling terminal gelesen werden. Ausserdem kann es je 
nach threat model sinn machen, secure memory zu verwenden (speicher, der 
im idealfall nicht geswappt werden kann und beim free genullt wird. Eine 
implementation wäre gcry_malloc_secure.). Windows kocht überall halt wie 
immer sein eigenes Süppchen, mit dem winapi mist. Ich empfehle ein 
richtiges OS zu verwenden, nicht so ein proprietäres frickelsystem wie 
Windows.

Besser währe eventuell noch, gleich die vorgesehenen Funktionen dafür zu 
nehmen, statt das selber zu machen. Die POSIX Standardfunktion zum 
einlesen von Passwörtern ist getpass. Unter BSD gibt es das verbesserte 
readpassphrase.

Wenn möglich ist die Verwendung von pam zur Authentifizierung zu 
bevorzugen. http://man7.org/linux/man-pages/man3/pam.3.html

Jenachdem kann es gar sinvoll sein, Programme wie su zu verwenden.

Bei Terminals ist es ausserdem unüblich, die Anzahl eingegebener Zeichen 
mit Sternchen anzuzeigen. Das ist ein Sicherheitsaspeckt, wenn man die 
Passwortlänge kennt, ist es schon um einiges leichter, das Passwort zu 
erraten.

von ohne Account (Gast)


Lesenswert?

> _getwch ist eine Windowsspezifische non-standard funktion, selbes gillt
> für _getch. Und getch ist normalerweise eine curses funktion, curses ist
> eine Library für Konsolenprogramme. Die Standardfunktion im c standard
> zum Lesen eines Zeichens ist getchar.
Er benutzt die C99 oder C11 Variante und der Rest ist dann auch nicht 
weiter erwähnenswert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.