• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

c++ zakrycie hasła + zapis/ odczyt z pliku

Object Storage Arubacloud
0 głosów
1,313 wizyt
pytanie zadane 1 stycznia 2019 w C i C++ przez nooblike Nowicjusz (120 p.)

Cześć, od niedawna uczę się C++ i wymyśliłem sobie takie zadanie, żeby napisać program, który przy wpisywaniu hasła zakrywa je i zamienia na "*". Nic wielkiego, nie jest to też jakoś bardzo praktyczne - zwykłe ćwiczenie i ciekawość. Znalazłem fajny kod pod WindowsAPI i coś tam skleiłem. Jednak ten kod czyta hasło ze statycznego chara "const char *correct_password = hasło" - czyli hasło trzeba wpisać. Teraz sobie pomyślałem, że fajnie by było gdyby program najpierw pytał o rejestrację, czyli np. wypluwał dwie opcje: 1. rejestracja, 2. login (zwykły cout). W punkcie 1. pytałby o login i hasło - bez zakrywania inputu, czyli pewnie cin, po czym zapisywał dane do pliku .txt. Później loopowałby do początku i przy wyborze opcji 2. login, wpisywałoby się login i hasło - już z zakrytym inputem, tak jak w kodzie programu, i wtedy program czytałby z pliku .txt (pewnie jakiś fstream) czy użytkownik faktycznie jest zarejestrowany i sprawdziłby poprawność danych (if). Próbowałem wielu opcji i w żaden sposób nie mogę tego ogarnąć - kod zakrywania inputu hasła, który wklejam pod spodem, jest za trudny i nie za bardzo wiem jak ugryźć zapisywanie zakrytego chara do pliku a potem sprawdzanie go. Kombinowałem żeby w stringu getpass password == jakiś_inny_string i potem żeby zapisywał go do pliku, ale nic z tego. Macie może jakieś pomysły? A może trzeba przepisać w inny sposób zakrywanie inputu? Chodzi mi konkretnie żeby po "rejestracji" input był zakryty gwiazdkami "*" i jednocześnie sprawdzał z danymi w pliku .txt. Fajnie jeśli ktoś rzuci jakieś pomysły. Próbowałem pytać na stackoverflow, ale tam mnie minusowali - nie wiem po co, jestem początkującym koderem, który nigdy nie programował - na co dzień siedzę w elektronice/ naprawach hardware'u i pomyślałem, że fajnie by było się pouczyć C++, tak hobbystycznie. Pod spodem wklejam kod zakrywania inputu hasła, nic więcej nie mam. Szczęśliwego Nowego Roku, tak w ogóle :)

#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

string getpass(const char *dat, bool s_asterisk=true)
{
  const char BACKSPACE=8;
  const char RETURN=13;

  string password;
  unsigned char ch=0;

  cout << dat;

  DWORD con_mode;
  DWORD dwRead;

  HANDLE hIn=GetStdHandle(STD_INPUT_HANDLE);

  GetConsoleMode( hIn, &con_mode );
  SetConsoleMode( hIn, con_mode & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT) );

  while(ReadConsoleA( hIn, &ch, 1, &dwRead, NULL) && ch !=RETURN)
    {
       if(ch==BACKSPACE)
         {
            if(password.length()!=0)
              {
                 if(s_asterisk)
                     cout <<"\b \b";
                 password.resize(password.length()-1);
              }
         }
       else
         {
             password+=ch;
             if(s_asterisk)
                 cout <<'*';
         }
    }
  cout << endl;
  return password;
}



int main()
{
  const char *correct_password="fdsidfjsijdsf21128321873";

    START:

  string password=getpass("Enter the password: ",true);
  if(password==correct_password){
      cout <<"\nCorrect password."<<endl;
      exit(1);
  }else{
      cout <<"\nIncorrect password. Try again.\n"<<endl;
      goto START;
  }

  return 0;
}

 

 

2 odpowiedzi

0 głosów
odpowiedź 1 stycznia 2019 przez Jakub 0 Pasjonat (23,120 p.)
edycja 1 stycznia 2019 przez Jakub 0

Moje rozwiązanie na zakrycie wpisywanego hasła:

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

int main() {

    constexpr char c_enter  = 13;
    constexpr char c_backspace = 8;

    std::string passwd;
    char input_character;

    std::cout<<"Podaj haslo: ";
    input_character = getch();

    while(input_character!=c_enter) {

        if(input_character==c_backspace && passwd.size()){
            std::cout<<"\b \b";
            passwd.pop_back();
        }
        else if(input_character!=c_backspace) {
            std::cout.put('*');
            passwd+=input_character;
        }

        input_character= getch();
    }

    std::cout<<std::endl<<"ukryty napis: " << passwd << std::endl;

    std::string correctPasswd("Domek@!123");
    if(passwd==correctPasswd){
        std::cout<<"Haslo jest poprawne.\n";
    }else{
         std::cout<<"Haslo nie jest poprawne.\n";
    }
}

Wczytuje tu każdy znak osobno, od razu po jego naciśnięciu wypisuje wypełniacz ( * ) a znak dodaje do string'a. Jeśli wciśniesz backspace to ostatnia litera hasła jest wykasowywana a kursor cofa się do tył ( zamieniając ostatni znak na znak biały na wszelki wypadek - bo działanie \b jest zależne od systemu  ).

Jest problem taki że getch() to dość przestarzała funkcja, ale jestem otwarty na nowe i lepsze rozwiązania :)

komentarz 1 stycznia 2019 przez Hiskiel Pasjonat (22,830 p.)
Podbijam. Sam chętnie się dowiem czy jest coś nowszego niż getch().
0 głosów
odpowiedź 1 stycznia 2019 przez sebeks Mądrala (5,300 p.)
Ja bym to zrobił tak, że wpisywane hasło było zapisywane do zmiennej string po jednym znaku, a po każdym naciśnięciu klawisza na konsolę wyświetlałbym gwiazdkę (jedną na każdy wprowadzony znak) pętlą for, gdzie ilość kroków pętli równa była by długości wprowadzonej zmiennej string (string::size). Wciśniecie Enter uruchamiałoby porównanie wprowadzonego stringa z stringiem hasła z pliku.

W programowaniu rejestracja i logowanie są realizowane przeważnie oddzielnie. Przy "rejestracji" musisz dodać rekord do pliku i wcześniej sprawdzić czy rekord nie istnieje, by uniemożliwić występowanie dwóch użytkowników o tej samej nazwie. Dopiero potem dodać nowy rekord. Przy logowaniu musisz sprawdzić czy rekord istnieje w pliku i czy hasło pasuje.

W tej Twojej zabawie jest jeszcze temat szyfrowania danych w pliku, by nie dało się ich wprost odczytać. Jeśli to zabawa to użyj jakiegoś prostego szyfru ROT13 lub ROT47 (lub innego podstawieniowego). Wtedy musisz jeszcze dodać szyfrowanie wprowadzonego hasła zanim sprawdzisz je z plikiem.

Podobne pytania

0 głosów
1 odpowiedź 507 wizyt
pytanie zadane 7 grudnia 2018 w C i C++ przez matiibal Użytkownik (620 p.)
0 głosów
1 odpowiedź 245 wizyt
pytanie zadane 3 listopada 2018 w C i C++ przez gorgonkowa Obywatel (1,810 p.)
0 głosów
2 odpowiedzi 220 wizyt
pytanie zadane 27 grudnia 2018 w C i C++ przez VecsonON Nowicjusz (190 p.)

92,555 zapytań

141,402 odpowiedzi

319,543 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...