Gwiazdki podczas wpisywania hasla w konsoli - jezyk c++

czacha

Gwiazdki podczas wpisywania hasla w konsoli - jezyk c++

Post autor: czacha »

Witam!
Chcialbym sie dowiedziec jak sprawic zeby w "czarnym okienku" podczas wpisywania hasla pojawialy sie gwiazdki zamiast liter, ale zeby komputer przyjal podany wyraz i dobrze gdyby byl to typ string, bo ktos mi juz zaproponowal zebym w petli pobieral pojedyncze znaki funkcja getchar()
ktora nie pokazuje tego co wpisujesz, i zebym w petli wyswietlal gwiazdke, ale to nie okazalo sie zbyt optymalnym rozwiazaniem dlatego prosze o pomoc.
Pozdrawiam
Ostatnio zmieniony 6 lis 2006, o 15:25 przez czacha, łącznie zmieniany 3 razy.
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

Gwiazdki podczas wpisywania hasla w konsoli - jezyk c++

Post autor: kadiii »

Zapodam linka -> ... 58013.html i choć jest tam pobieranie po jednym znaku to jednak sposób myślę dobry, na inny nie mam pomysłu. (przyjmuje, że "czarne okienko" to konsola.
czacha

Gwiazdki podczas wpisywania hasla w konsoli - jezyk c++

Post autor: czacha »

dzieki kadii. chcialbym sie jeszcze tylko dowiedziec jaki kod trzeba wpisac zeby klawisz backspace spelnial swoja pierwotna funkcje, a nie byl traktowany tak jak inne klawisze

[ Dodano: 31 Październik 2006, 15:55 ]
Pozostaje rowniez problem porownywania hasel. Przedstawiam ponizej swoj kod ktory nie jest poprawny poniewaz haslo zawsze jest bledne. Uprzejmie prosze o pomoc w odnalezieniu bledu. Pozdrawiam

-------------------------------------------------------------------------------------

Kod: Zaznacz cały

#include <cstdlib>
#include <iostream>
#include <conio.h>

using namespace std;

int main(int argc, char *argv[])
{
    char kod[10], c;
    int i = 0;

    cout << "Podaj haslo: " << endl;

    while((c = getch()) != 13) // 13, to kod ENTERA, który kończy wpisywanie hasła                                                                
    {
        cout << "*";
        kod[i++] = c;
    }
    
    char kod2[10] = "marcin";
    
    if (kod == kod2)cout << "
Haslo jest poprawne
";
    else cout << "
Haslo jest bledne
";

    getch();
    return 0;
}
-------------------------------------------------------------------------------------[/code]
Ostatnio zmieniony 31 paź 2006, o 18:25 przez czacha, łącznie zmieniany 4 razy.
Awatar użytkownika
amdfanatyk
Użytkownik
Użytkownik
Posty: 98
Rejestracja: 27 mar 2005, o 14:59
Płeć: Mężczyzna
Lokalizacja: /dev/zero
Podziękował: 9 razy
Pomógł: 7 razy

Gwiazdki podczas wpisywania hasla w konsoli - jezyk c++

Post autor: amdfanatyk »

glowne problemy Twoje w tym przypadku sa 3 z czego 2 rozwiazalem; 1 - operator == (rownosc) nie dziala dla typow char == char tak jakbys sie tego spodziewal, jesli juz chcesz bawic sie tablicami znakow (uwaga jest to ryzykowne! tablice znakowe to najczesciej wykorzystywana droga do wstrzykniecia kodu w dzialajacy program), to kontroluj zakresy, jesli masz 10 elementow, to mozesz tam wstawic 9 liter i znak konca \0, lepiej uzywaj kontenerow, np. string, tam string == string zadziala jak oczekujesz 2 - zeby to porownanie zadzialalo musisz uzyc funkcji strcmp lub strncmp (druga bezpieczniejsza) a jesli uzytkownik podal mniej niz 9 znakow, dopisac \0 do konca, inaczej bedziesz tam miec losowe smieci, czyli to co aktualnie znajdowalo sie w tym miejscu na stosie 3 - drukownie gwiazdek nic tu nie daje, musialbys jakos przechwytywac znaki w locie, inaczej poprostu wpisujesz, dajesz enter i czyta to, co juz widac, potem drukuje gwiazdki 4 - osobna sprawa jest to, ze takie haslo mozna odczytac edytujac skompilowany program np. edytorem szesnastkowym, najczesciej robi sie tak, ze pobiera sie ciag znakow od uzytkownika, tworzy sie skrot tego ciagu (korzysta sie z funkcji jednokierunkowej np. MD5) i porownuje z wersja zaszyfrowana (skrotem)

Kod: Zaznacz cały

#include <iostream>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[])
{
	char kod[10], c;
	int i = 0;

	cout << "Podaj haslo: " << endl;

	while ((i != 8) && ((c = getchar()) != 10))
		kod[i++] = c;

	for (; i != 9 ; i++)
		kod[i] = '\0';

	char kod2[10] = "marcin";

	if (strncmp(kod, kod2, 10) == 0)
		cout << "\nHaslo jest poprawne\n";
	else
		cout << "\nHaslo jest bledne\n";

	return 0;
}
Ostatnio zmieniony 31 paź 2006, o 20:59 przez amdfanatyk, łącznie zmieniany 1 raz.
czacha

Gwiazdki podczas wpisywania hasla w konsoli - jezyk c++

Post autor: czacha »

Byc moze jest to i dobry sposob, aczkolwiek nie spelnia glownego wymagania jakiego oczekuje - wpisywany tekst jest widoczny, a ja jestem tu wlasnie po to zeby tego faktu uniknac, i w tej sprawie uzyskalem juz pomoc i jestem tej osobie wdzieczny. Widze ze zle zrozumiales moje potrzeby, wiec jeszcze raz powtarzam dla lepszego pojecia:
1-jak rozwiazac blad w moim kodzie zamieszczonym powyzej polegajacy na
tym,ze haslo zawsze jest bledne
2-jak sprawic zeby klawisz backspace spelnial swoje pierwotne przeznaczenie
kiedy go wciskam, a nie byl traktowany jak kazdy inny klawisz czyli
zatoczenie petli i tym samym wyswietlenie gwiazdki
Licze na pomoc i pozdrawiam
Awatar użytkownika
amdfanatyk
Użytkownik
Użytkownik
Posty: 98
Rejestracja: 27 mar 2005, o 14:59
Płeć: Mężczyzna
Lokalizacja: /dev/zero
Podziękował: 9 razy
Pomógł: 7 razy

Gwiazdki podczas wpisywania hasla w konsoli - jezyk c++

Post autor: amdfanatyk »

gdybys raczyl przeczytac, to co napisalem, wiedzialbys dlaczego kod jest zawsze bledny, kod i kod2 to adresy pierwszych elementow tablic typu char, zatem nie porownasz na pewno ciagow znakow w taki sposob jak to zrobiles w "swoim" kodzie, nie trudno sie domyslec, ze tak utworzone tablice, nie beda dzielic tych samych komorek pamieci, wiec i adresy ich pierwszych elementow beda rozne.

[ Dodano: 31 Październik 2006, 20:53 ]
jesli chodzi o maskowanie hasla przy wpisywaniu, to odpowiedz znajdziesz przegladajac getpass.c z pakietu coreutils

Kod: Zaznacz cały

http://ftp.gnu.org/pub/gnu/coreutils/

Kod: Zaznacz cały

char *
getpass (const char *prompt)
{
  FILE *tty;
  FILE *in, *out;
  struct termios s, t;
  bool tty_changed = false;
  static char *buf;
  static size_t bufsize;
  ssize_t nread;

  /* Try to write to and read from the terminal if we can.
     If we can't open the terminal, use stderr and stdin.  */

  tty = fopen ("/dev/tty", "w+");
  if (tty == NULL)
    {
      in = stdin;
      out = stderr;
    }
  else
    {
      /* We do the locking ourselves.  */
      __fsetlocking (tty, FSETLOCKING_BYCALLER);

      out = in = tty;
    }

  flockfile (out);

  /* Turn echoing off if it is on now.  */
#if HAVE_TCGETATTR
  if (tcgetattr (fileno (in), &t) == 0)
    {
      /* Save the old one. */
      s = t;
      /* Tricky, tricky. */
      t.c_lflag &= ~(ECHO | ISIG);
      tty_changed = (tcsetattr (fileno (in), TCSAFLUSH | TCSASOFT, &t) == 0);
    }
#endif

  /* Write the prompt.  */
  fputs_unlocked (prompt, out);
  fflush_unlocked (out);

  /* Read the password.  */
  nread = getline (&buf, &bufsize, in);

  /* According to the C standard, input may not be followed by output
     on the same stream without an intervening call to a file
     positioning function.  Suppose in == out; then without this fseek
     call, on Solaris, HP-UX, AIX, OSF/1, the previous input gets
     echoed, whereas on IRIX, the following newline is not output as
     it should be.  POSIX imposes similar restrictions if fileno (in)
     == fileno (out).  The POSIX restrictions are tricky and change
     from POSIX version to POSIX version, so play it safe and invoke
     fseek even if in != out.  */
  fseek (out, 0, SEEK_CUR);

  if (buf != NULL)
    {
      if (nread < 0)
	buf[0] = '\0';
      else if (buf[nread - 1] == '\n')
	{
	  /* Remove the newline.  */
	  buf[nread - 1] = '\0';
	  if (tty_changed)
	    {
	      /* Write the newline that was not echoed.  */
	      putc_unlocked ('\n', out);
	    }
	}
    }

  /* Restore the original setting.  */
#if HAVE_TCSETATTR
  if (tty_changed)
    tcsetattr (fileno (in), TCSAFLUSH | TCSASOFT, &s);
#endif

  funlockfile (out);

  call_fclose (tty);

  return buf;
}
czacha

Gwiazdki podczas wpisywania hasla w konsoli - jezyk c++

Post autor: czacha »

Nie bardzo pojmuje o co chodzi. Rozumiem, ze getpass.c jest plikiem jezyka c
zawierajacym funkcje getpass(), ale nie rozumiem po co ten link? poza tym wolalbym miec to w c++. ten link prowadzi pewnie do jakiejs biblioteki ktora jest niezbedna do dzialania pliku prawda?

[ Dodano: 1 Listopad 2006, 15:27 ]
dzieki amd fanatyk widze ze jest to biblioteka i to dosc spora, ale jest ona w jezyku c, z ktorym w zyciu nie mialem do czynienia, najbardziej bylbym zadowolony gdyby rozwiazac ten problem w c++, bo o innych jezykach nawet nie mysle. I bylbym bardzo zadowolony gdyby kod korzystal tylko z biblioteki standardowej lub ewentualnie z innych, ale chcialbym miec dokladnie podane jakie musze dolaczyc do programu pliki i wogole krok po kroku
ODPOWIEDZ