come mostrare la password di accesso sotto forma di asterischi (*) sul terminale

Voglio scrivere un semplice programma C per verificare la password , ad esempio se la password è uguale a 1234, quindi voglio stampare Welcome else riprova . Ma il problema è il seguente:

Voglio visualizzare inserire la password sotto forma di * ( stella ). per esempio … se l’utente inserirà 1234, apparirà come **** per evitare che un’altra persona veda la password inserita.

Qualcuno può darmi un’idea su come ottenerlo usando c o c ++. Piattaforma: UNIX

La soluzione a questo è specifica per la piattaforma, sfortunatamente.

Su Linux o BSD, puoi usare la funzione readpassphrase (c’è anche getpass , anche se soffre di non permettere che il buffer sia il buffer e la dimensione del buffer.) La documentazione per GNU Lib C (link non funzionante? Prova invece questa alternativa La libreria fornisce anche un’eccellente guida su come implementare questo in termini di primitive di livello inferiore, che è ansible utilizzare su altre implementazioni UNIX in lieue of getpass).

Su Windows, è ansible utilizzare SetConsoleMode per disabilitare il comportamento di echo predefinito (e quindi echo i propri caratteri come l’asterisco). È quindi ansible utilizzare SetConsoleMode per ripristinare l’eco.

Devo aggiungere, tuttavia, che si tratta di una forma di autenticazione molto scarsa in quanto implica ancora più password che sono la rovina dell’esistenza di ogni utente (e non particolarmente sicura, neanche). Un approccio migliore consiste nell’avviare un server web nell’applicazione e generare l’URL su cui l’utente deve autenticarsi. Il vantaggio di questo approccio è che, quando l’utente naviga verso questo URL, tale URL può quindi supportare l’accesso delegato a provider di identity framework di terze parti come Google, Facebook, Twitter, ecc. Anche se non supporti provider di id quadro di terze parti, questo approccio viene fornito con altri vantaggi; se si dispone di altri strumenti basati sul Web, questo approccio riduce il numero di volte che l’utente deve autenticarsi (poiché lo strumento della riga di comando e gli strumenti basati sul Web condividono la stessa sessione del browser) e consente di implementare il stream di accesso solo una volta, questo approccio riduce anche i rischi di phishing (gli utenti possono chiaramente vedere l’host nel browser quando inseriscono le proprie credenziali rispetto all’immissione delle credenziali sulla riga di comando in cui è molto più facile falsificare un prompt e se si reindirizza a localhost solo all’ultimo passaggio ma si fa il la maggior parte della logica su un host remoto questo approccio consente inoltre di implementare gli aggiornamenti del stream di authorization indipendentemente dall’applicazione della riga di comando del client che presenta importanti vantaggi per la sicurezza. Vale anche la pena di esaminare meccanismi di autenticazione alternativi come libpam (in libpam, si utilizzerà la funzione pam_authenticate per autenticare l’utente piuttosto che prendendo la password come input direttamente). Vale la pena investire qualche ricerca per determinare il meccanismo migliore per il proprio caso d’uso particolare.

Su Linux e su altre piattaforms simili a Unix è ansible utilizzare termios.h per questo. È necessario distriggersre la modalità canonica di fine echo per l’output e la stampa * dopo ogni carattere ottenuto. C’è un esempio di codice C:

 #include  struct termios term; /* Disable echo input characters and buffered input by disabling ICANON*/ static void disable_echo() { struct termios new; if (tcgetattr(fileno(stdin), &term) != 0) { perror("tcgetattr failed"); exit(-1); } new = term; new.c_lflag &= ~ICANON; new.c_lflag &= ~ECHO; if (tcsetattr(fileno(stdin), TCSAFLUSH, &new) != 0) { perror("tcsetattr failed"); exit(-1); } } /* Enable normal terminal state after getting password*/ static void enable_echo() { if (tcsetattr(fileno(stdin), TCSAFLUSH, &term) != 0) { perror("tcsetattr failed"); exit(-1); } } /* Read password which will be printed as `*` characters */ static void mask_getstr(char* buf, size_t size){ char c = '\0'; while (--size > 0 && (c = getchar()) != '\n') { *buf++ = c; putchar('*'); } *buf = '\0'; } 
  #include #include #include void main() { char str[10]; int i=0,x,y; cout<<"enter : "; while(1) { str[i]=getch(); if(str[i]==13) break; if(str[0]==127||str[0]==8) continue; if(str[i]==127||str[i]==8) { i--; x=wherex(); y=wherey(); gotoxy(x-1,y); clreol(); } else { cout<<"*"; i++; } } if(strcmp(str,"1234")==0) cout<<"Welcome"; else cout<<"Try again"; }