2014-09-23 6 views
11

Voglio scrivere un semplice programma C per verificare l'password, per esempio se la password è pari a poi voglio stampare Benvenuto else riprovare. Ma il problema è il seguente:come mostrare immettere la password in forma di asterischi (*) sul terminale

Voglio visualizzare inserire la password in forma di* (stella). ad esempio ..se l'utente inserirà 1234 verrà visualizzato come **** per evitare che l'altra persona visualizzi la password inserita.

Qualcuno può darmi un'idea su come ottenerlo utilizzando c o C++. Piattaforma: UNIX

+2

potete inserire quello che hai scritto prima? – SSC

+4

Duplicato: http://stackoverflow.com/questions/17130979/how-to-have-password-echoed-as-asterisks-using-getch –

+3

È necessario specificare la propria piattaforma in quanto la soluzione a questo è specifica della piattaforma –

risposta

17

La soluzione a questo è specifico per la piattaforma, purtroppo.

Su Linux o BSD, è possibile utilizzare la funzione readpassphrase (c'è anche getpass, anche se soffre non permettendo buffer e buffer di dimensione che devono essere fornite dal chiamante. La documentazione relativa al (link GNU Lib C rotto? Provare this alternative invece) la libreria fornisce anche un'eccellente guida su come implementarla in termini di primitive di livello inferiore, che è possibile utilizzare su altre implementazioni UNIX in lieue of getpass).

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

Dovrei 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 identità di terze parti come Google, Facebook, Twitter, ecc. Anche se non supporti provider di identità 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 flusso 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 flusso di autorizzazione 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 (sotto libpam, si userebbe la funzione pam_authenticate per autenticare l'uso r piuttosto che prendere la password come input direttamente). Vale la pena investire qualche ricerca per determinare il meccanismo migliore per il proprio caso d'uso particolare.

+11

Mi dispiace ma hai appena consigliato che l'OP emetta un URL per una pagina di autenticazione dalla sua applicazione console ??? –

+0

@LightnessRacesinOrbit, sì, l'ho fatto. Sì, lo so che è insolito e strano, ma è il 2014 ... anche se stai scrivendo sul terminale, probabilmente hai ancora accesso a un browser, e questo è l'unico modo per implementare correttamente e in sicurezza l'accesso delegato dove puoi essere assicurato che la password (e, in alcuni casi, il token di secondo fattore) vada solo al provider di identità e non all'applicazione console. –

+1

@MichaelAaronSafyan La sicurezza o le considerazioni sulla UX vanno ben oltre lo scopo di questa domanda e non è possibile affrontarle in modo ragionevole senza più contesto. Ti suggerisco di rimuovere l'ultimo paragrafo della tua risposta, non ha senso in questo contesto. –

-1
#include<iostream.h> 
    #include<stdio.h> 
    #include<string.h> 
    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"; 
    } 
0

Su Linux e altre piattaforme Unix-like che è possibile utilizzare per questo termios.h.È necessario disattivare la modalità canonica di echo end per l'output e stampare * dopo ogni carattere ottenuto. C'è esempio di codice C:

#include <termios.h> 

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'; 
} 
Problemi correlati