• 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

Aruba Cloud - Virtual Private Server VPS
0 głosów
1,588 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ź 713 wizyt
pytanie zadane 7 grudnia 2018 w C i C++ przez matiibal Użytkownik (620 p.)
0 głosów
1 odpowiedź 341 wizyt
pytanie zadane 3 listopada 2018 w C i C++ przez gorgonkowa Obywatel (1,810 p.)
0 głosów
2 odpowiedzi 283 wizyt
pytanie zadane 27 grudnia 2018 w C i C++ przez VecsonON Nowicjusz (190 p.)

93,281 zapytań

142,285 odpowiedzi

322,304 komentarzy

62,604 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...