mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Bartosz B. (bartosz)
Datum:

Bewertung
0 lesenswert
nicht 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...

Youtube-Video "C++: Passwortabfrage erstellen"

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.
bool Passwortabfrage(string richtigesPasswort)
{
  char einZeichen; //letztes, eingegebenes Zeichen
  string ganzesPasswort;
  einZeichen = getch();

  while (einZeichen != '\r')  //solange nicht ENTER...
  {
    if (einZeichen != '\b') //wenn nicht BACKSPACE...
    {
      ganzesPasswort = ganzesPasswort + einZeichen;
      putch('*');
    }
    else if (einZeichen == '\b' && ganzesPasswort.length() > 0)
    {
      ganzesPasswort.resize(ganzesPasswort.length() - 1);
      putch('\b');  //Cursor nach links
      putch(' ');  //überschreiben
      putch('\b'); //wieder auf Leerzeichen draufspringen
    }
    einZeichen = getch();
  }

  if (ganzesPasswort == richtigesPasswort)
  {
    return true;
  }
  else
  {
    return false;
  }
}


*In der main*

for (int i = 0; i <= 2; i++)
  {
    printf("Passwort: ");
    if (Passwortabfrage("hallo Welt"))
    {
      printf("\nOK\n");
      break;      //aus for-Schleife raus
    }
    else
    {
      Beep(500, 500);
      Beep(300, 500);
      printf("Passwort ist falsch!\n");
    }
  }

: Verschoben durch Moderator
Autor: foobar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Doch mein System spielt mir einen Streich...

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

Autor: Bartosz B. (bartosz)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: foobar (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert

Autor: foobar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
s/Windows/C-Runtime/

Autor: Bartosz B. (bartosz)
Datum:

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

Autor: DPA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ohne Account (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.