Domanda:
Come dimostrare che il sistema di autenticazione funziona e che il cliente utilizza la password sbagliata?
Mario Trucco
2016-11-09 21:17:05 UTC
view on stackexchange narkive permalink

Occasionalmente (anche se raramente), alcuni dei nostri utenti dicono che la loro password non funziona: dicono di aver digitato la password corretta ma di aver ricevuto il messaggio "password sbagliata" .

Diciamo loro di utilizzare la funzione reimposta password , cosa che fanno, ma mantengono la sensazione che il sistema di autenticazione a volte non funzioni .

La nostra ipotesi è che la loro password non sia quella che ricordano, ma poiché non la memorizziamo come testo normale, abbiamo qualche modo per dimostrare che è così?

In alcune occasioni siamo stati in grado di dimostrare loro che in una certa data avevano cambiato la loro password e poi l'hanno dimenticata, e sono rimasti soddisfatti. Ma non è sempre così.

I commenti non sono per discussioni estese;questa conversazione è stata [spostata in chat] (http://chat.stackexchange.com/rooms/48508/discussion-on-question-by-mario-trucco-how-to-prove-that-authentication-system-w).
Nove risposte:
Bryan Field
2016-11-09 22:14:41 UTC
view on stackexchange narkive permalink

Non esiste un modo rapido per dimostrarlo perché l'hash è progettato per non essere reversibile .

Puoi prendere la password rivendicata e generare manualmente il hash come @TechTreeDev suggerito. Dovresti usare un hash salato (cioè BCrypt) quindi assicurati di usare lo stesso salt.

  • Se l'hash generato manualmente corrisponde, allora hai riscontrato un problema nel login codice.

  • Più probabilmente l'hash generato sarà diverso, quindi hai escluso problemi con il codice di accesso , ma potrebbero ancora esserci un problema con la configurazione della password o un errore nella generazione manuale.

Questo è più o meno l'entità di ciò che puoi fare per controllare la password di una singola persona . Oltre a ciò entriamo nel test del sistema.

  • Se sospetti un caso limite casuale / intermittente, potresti creare uno script di test scimmia per impostare le password e poi provali. Tuttavia, questo approccio è probabilmente eccessivo.

  • La cosa migliore è rivedere il codice di accesso e tutti i punti che reimpostano la password . Il codice dovrebbe essere il più breve e conciso possibile. Nella mia esperienza, il modo migliore per escludere problemi di casi limite è con la revisione del codice, poiché tali casi limite spesso non sono coperti da test manuali.

Alcune cose da fare cerca:

  • Assicurati che l'impostazione maxlength sia coerente (o meglio ancora, non presente) su qualsiasi password <input> s. Stai cercando coerenza tra la configurazione della password e il modulo di accesso.

  • Assicurati che non vi sia alcun troncamento lato server.

  • Assicurati che la codifica sia coerente. Se nella password viene utilizzato un carattere non ASCII, il modulo di configurazione della password e i moduli di accesso devono comportarsi esattamente allo stesso modo.

  • Inoltre, non rimuovere automaticamente dalla password caratteri quali spazi vuoti o non ASCII . Questo è il genere di cose che puoi facilmente individuare con una revisione del codice se il tuo codice è conciso.

Infine alcuni suggerimenti umani:

  • Verifica prima che stiano utilizzando il nome utente corretto .

  • Verifica che l'impostazione blocco maiuscole sia corretta.

  • Fornisci al personale dell'assistenza clienti un registro di ogni data / ora di accesso o di reimpostazione della password. Se è stato effettuato almeno un accesso dall'ultimo ripristino allora sanno che il sistema ha funzionato correttamente.

    Fintanto che il codice di accesso è invariato e l'hash è invariato dall'ultimo successo, si può essere ragionevolmente certi che il problema deve essere una password digitata male.

  • Rivedi l ' UX dell'errore di password errata , fornendo all'utente alcuni semplici suggerimenti e una spiegazione autorevole delle possibilità. Ciò potrebbe ridurre le chiamate al servizio clienti.

  • Potrebbe essere utile avvisare tramite email il cliente quando una password viene reimpostata per ricordarglielo. (o altro membro della famiglia in caso di account condivisi)

Insieme al passaggio di codifica, verificherei anche che qualsiasi convalida dei dati o filtraggio dei caratteri eseguito sia coerente.LinkedIn una volta mi ha permesso di inserire |carattere in una password e accedi perfettamente al loro sito web.Ma la loro app mobile apparentemente non accettava password con quel carattere e si è rifiutata di autenticarmi finché non l'ho rimossa.
I primi due suggerimenti umani sono importanti e mano nella mano.Non è una pratica insolita tagliare e convertire il nome utente fornito dall'utente e il nome utente DB in un unico caso in modo che corrispondano correttamente.Ciò è particolarmente utile quando i telefoni cellulari desiderano applicare il limite automatico al primo carattere.Sembra che possiamo trasmettere a tutti la distinzione tra maiuscole e minuscole con le password, ma sfortunatamente non è così con i nomi utente.Questa è una delle volte in cui potresti dover sacrificare la sicurezza per l'usabilità.
Suggerimento aggiuntivo per le persone: verifica che utilizzino la stessa ** lingua di input ** e ** layout di tastiera ** di quando hanno creato la password.Se hanno più lingue installate sul PC, potrebbero aver premuto accidentalmente la combinazione di tasti che passa alla lingua successiva, quindi i tasti che stanno premendo non producono i caratteri che si aspettano.
Nelle connessioni al server terminal a volte il problema è che se non c'è un ritardo sufficientemente lungo tra la pressione del tasto Maiusc e il tasto della lettera per la lettera maiuscola che si desidera digitare, il segnale di spostamento arriva in ritardo al server e il campo della password ottiene illettera minuscola come input.Questo mi ha dato molte volte la sensazione di essere completamente stupido e di non ricordare la mia password.Tuttavia, questo è limitato a mstsc, non ho mai avuto questo problema con gli accessi web.
Ho avuto un'esperienza simile in cui il tasto MAIUSC non si rilasciava rapidamente / abbastanza forte su una tastiera portatile di qualità inferiore, causando la scrittura accidentale di una lettera aggiuntiva in maiuscolo.Tuttavia, sembra che il ritardo dell'esperienza del terminale sia stato più significativo.
Non sono sicuro che la revisione del codice sia il modo giusto per scoprire che la tua password gestisce i caratteri di eliminazione, perché dovrebbe essere automatizzata.Includi password che testano tutte le contingenze nella tua suite di test di integrazione e assicurati che gli hash archiviati nel database corrispondano sempre alle password immesse.
Sono d'accordo sul fatto che non si dovrebbero rimuovere gli spazi * all'interno * di una password, ma si potrebbe fare un caso per almeno * tagliare * gli spazi bianchi.Uno spazio accidentale all'inizio o alla fine è abbastanza comune.Conosco alcune persone che aggiungono istintivamente uno spazio alla fine di ogni input (immagino perché sono così abituate ad aggiungere uno spazio dopo le parole).
Qualunque cosa tu faccia: ** non addestrare gli utenti a fornire a nessuno la propria password **
Anche per me gli spazi principali sono stati un grosso problema tra gli utenti.Le persone sono così abituate a premere la barra spaziatrice per riportare i computer dalla sospensione che lo fanno istintivamente alle schermate di accesso ...
Penso che siamo tutti d'accordo nel non rimuovere gli spazi bianchi interni.Personalmente, non penso sia appropriato rimuovere nemmeno gli spazi bianchi iniziali o finali.(I computer dovrebbero essere prevedibili IMHO) Detto questo, sembra che Google lo faccia.
Un altro elemento: assicurati che l'hashing sia sempre eseguito dal server DBMS o LDAP di destinazione, non dal tuo codice.In questo modo è molto meno probabile che tu introduca un bug di hashing e il tuo codice diventa molto più trasparente, ad es.`SELEZIONA COUNT (*) DA UTENTI WHERE USERNAME =?AND PASSWORD = H (?) `Per qualche funzione hash` H`, dove il risultato è 1 in caso di successo e 0 in caso di fallimento, e analogamente `INSERT INTO USERS (USERNAME, PASSWORD) VALUES (?, H (?))`la stessa "H".
@EJP, Non è una buona idea perché le password possono essere esposte tramite il log delle istruzioni, binlog o `show processlist`.Inoltre, è più importante scegliere l'algoritmo hash corretto (ad esempio BCrypt, scrypt, Argon2) e alcuni server di database (ad esempio MySQL) non offrono queste scelte internamente.
Registrazione delle modifiche della password.Puoi dire che hai cambiato la tua password su ... e l'ultimo accesso ... e non sei riuscito ad accedere ...
"Non rimuovere automaticamente" si applica anche al nome utente.Ma anche "non smettere di rimuovere automaticamente" che mi ha causato problemi prima (come utente)
Per scopi di debug, farei in modo che la registrazione della modifica della password memorizzi l'hash nel registro (non visualizzato all'utente). Ciò consente di verificare rapidamente che da allora non siano state apportate modifiche involontarie alla password.
@BrianKnoblauch Ho notato che alcune persone usano anche la barra spaziatrice invece di Backspace, soprattutto le persone di vecchia generazione e non tecnologiche.
Avere hash diversi non si rivela molto: potresti avere un problema con il tuo codice che genera hash.
SQB
2016-11-10 04:03:27 UTC
view on stackexchange narkive permalink

C'è un modo per saperlo con certezza, ed è calcolare l'hash di ciò che l'utente ha inserito, usando lo stesso salt e confrontandolo con quello che hai. Tuttavia, questo è ciò che già fa il processo di accesso e l'utente non ci crede. Perché dovrebbero crederci quando lo fai per loro?


Invece, potresti fare quello che ho visto spesso ultimamente, ad esempio in Windows 10, ma anche sui siti web:

Fornisci all'utente un modo per verificare ciò che ha inserito.

Ovviamente, quando si accede, i caratteri devono essere rappresentati come punti o altri caratteri, quindi i ficcanaso non possono vedere la password guardando alle spalle dell'utente.

Ma finché è nel campo di input, non è stata ancora crittografata o hash in alcun modo. Quindi fornisci un pulsante che trasformi quei punti nei caratteri reali.
In questo modo, dopo aver inserito la password sbagliata, potranno inserirla di nuovo e vedere cosa hanno appena inserito. Oppure possono controllare prima di accedere.

CapsLock dimenticati, turni sospesi, errori di battitura; possono essere rilevati tutti dall'utente in questo modo.

Sì, un'ottima idea.Poiché la maggior parte dei siti non lo implementa (ancora), e la maggior parte di quelli non lo implementerà mai, utilizzo il componente aggiuntivo FIrefox: "Show my Password".
CoffeDeveloper
2016-11-10 15:48:38 UTC
view on stackexchange narkive permalink

Per migliorare la tua esperienza utente devi prima di tutto aggiungere un po 'di interfaccia utente per comunicare agli utenti le seguenti condizioni:

  • Caps lock attivato
  • Avviso se ci sono spazi vuoti finali nel nome utente
  • Avviso se sono presenti spazi vuoti nella password
  • Impedisci l'utilizzo di spazi vuoti nell'email (se usi l'email invece del nome utente)
  • Impedisci l'utilizzo e rimuovi automaticamente le nuove righe (ci sono diverse nuove varianti di riga)
  • Impedisci l'utilizzo e rimuovi automaticamente i caratteri di controllo
  • Se stai usando Javascript, alcuni browser lo hanno disabilitato, quindi devi spostare questi passaggi sul server lato.

Inoltre, se la password inserita è sbagliata, visualizza il seguente messaggio:

La password o il nome utente / e-mail è sbagliato, per favore digita ​​strong > facendo attenzione alle lettere minuscole o maiuscole e a tutti i numeri dei simboli, devono corrispondere perfettamente . Evita di fare copia-incolla perché a volte la copia del testo può aggiungere ulteriori spazi bianchi e / o nuove righe indesiderate.

Tieni presente che i tuoi utenti potrebbero avere ragione ! Una volta avevo un vecchio telefono che non mi permetteva di accedere a una pagina web, non so se fosse un problema di codifica del testo ma la mia password era alfanumerica e funzionava perfettamente su un PC.

Questo messaggio scoraggia implicitamente l'uso di gestori di password.Uso maggiormente l'opzione di compilazione automatica sul mio manager, ma subito dopo di solito arriva l'opzione copia-incolla quando la compilazione automatica non funziona a causa di flash / nome di dominio / codice di campo di input / incompatibilità generale.
Contiene anche una virgola di giunzione.
@Nzall Non sta dicendo di impedire tecnicamente alle persone di incollare.Le persone che utilizzano i gestori di password sanno cosa stanno facendo: le persone che copiano e incollano da un file di testo, un messaggio di posta elettronica, un documento word, probabilmente introdurranno spazi vuoti indesiderati.
Out of Band
2016-11-10 04:24:35 UTC
view on stackexchange narkive permalink

La risposta accettata copre davvero la maggior parte di essa. Ma supponendo che ho provato tutti i suggerimenti lì e ancora non sono riuscito a trovare il problema, proverei quindi a rilevare l'errore quando si verifica. Per fare ciò, è possibile aggiungere il codice che ha registrato la password in chiaro ricevuta se un utente non è riuscito ad accedere due volte di seguito (in modo da filtrare tutti gli utenti che hanno appena commesso un errore stupido e lo hanno corretto al secondo tentativo).

Per non indebolire la sicurezza del tuo sistema, puoi abilitare la registrazione della password solo quando effettivamente c'era un utente sul telefono che ha avuto problemi ad accedere, e registrare solo la sua password, con la sua / il suo consenso.

La registrazione della password effettiva visualizzata dalla tua applicazione ha il vantaggio di vedere esattamente ciò che vede la tua applicazione. Dopo alcune chiamate da utenti disperati, potresti iniziare a prendere uno schema nelle loro password (ad esempio spazio finale, caratteri speciali ecc.) Che indicavano un problema nel tuo codice di accesso, oppure potresti vedere che intendevano per digitare "mysweetheart" ma invece "myseetheart", il che significherebbe che i problemi di accesso erano molto probabilmente tutti errori dell'utente.

Questo suona al limite impreciso.Non mi fiderei mai di un sistema una volta che avessi saputo che un amministratore poteva vedere la mia password in chiaro.
Sono d'accordo in linea di principio, ma la triste verità è che gli amministratori di tutti i server che servono le tue pagine web di accesso molto probabilmente POSSONO vedere la tua password se lo desiderano.Allora come fai a sapere che i servizi che utilizzi ogni giorno non lo fanno?L'unica cosa che mantiene riservata la tua password è la loro morale e le normative aziendali.
Ángel
2016-11-09 23:28:38 UTC
view on stackexchange narkive permalink

Non credo che l'esecuzione manuale dei passaggi di hashing della password sia la soluzione. Se hai rilevato che effettivamente fallisce, certo, puoi farlo a basso livello per eseguire il debug, ma i tuoi clienti se ne dimenticheranno quasi immediatamente.

Qui il problema è che stanno usando una password sbagliata , sia perché l'hanno digitato male, sia perché pensano di averne usato uno diverso da quello che hanno usato loro.

Per escludere il primo caso, fai scrivere la password desiderata in un editor di testo (ad es. blocco note ), taglialo negli appunti e incollalo nel campo della password. La password viene mostrata al cliente durante il processo, in modo che rimuova i casi in cui viene premuta una lettera sbagliata, Caps Lock è stato impostato ... (ovviamente ci aspettiamo che lo faccia in un momento in cui nessun altro sta guardando il proprio schermo )

Il secondo caso è più difficile, poiché non vogliamo incoraggiare i clienti a conservare un file di testo con le loro password. Idealmente, convinceresti i tuoi clienti a utilizzare un gestore di password come KeePass. Quindi, se la password, la stessa che funzionava prima, viene copiata correttamente dal gestore delle password, puoi essere certo che sia effettivamente la password giusta.

A parte questo, che richiede davvero un cambio di mente dei tuoi clienti, potresti chiedere ai tuoi clienti di:

  • creare una nuova password
  • cambiare la loro password in quella incollandola
  • provare ad accedere con la stessa password che hanno negli appunti

tutte le volte che vogliono, per tentare di riprodurla.

Nick
2016-11-10 04:17:37 UTC
view on stackexchange narkive permalink

Supponendo che tu stia effettuando l'accesso ogni volta che un utente effettua il login, potresti essere in grado di dimostrare che è stato in grado di accedere dall'ultima volta che ha cambiato la sua password. Questo sarebbe almeno sufficiente per escludere alcuni potenziali problemi.

Joshua
2016-11-12 23:30:59 UTC
view on stackexchange narkive permalink

Quando si incontrano quattro diversi sistemi di autenticazione con questa proprietà effettiva, è abbastanza facile da verificare in ogni caso.

Caso n. 1: il sistema fallisce casualmente. In caso di errore, il contatore di login errato non viene incrementato. (Non sono stato in grado di ispezionare l'interno ma sono abbastanza sicuro che quello che sta succedendo è che a volte perde la connessione con un altro server e riporta solo una password errata quando ciò accade.)

Caso n. 2: il sistema è saltato quando metto un apostrofo nella mia password. Dimostrare che il campo della password era soggetto a SQL injection è stato banale.

Caso n. 3: una password valida è stata rifiutata da un filtro di caratteri nella schermata di accesso che la schermata della password non aveva. Anche questo è stato banale per dimostrare il problema.

Caso n. 4: il sistema non mi ha permesso di accedere perché interpretava il segno at come kill line. Booo. L'accesso tramite telnet alla porta FTP ha dimostrato che avevo la password corretta.

b04ty
2016-11-10 21:42:05 UTC
view on stackexchange narkive permalink

È possibile memorizzare le ultime password (con hash) di ogni utente nel database. Se la password inserita non corrisponde alla password corrente, confrontarla con quella precedente. Se c'è una corrispondenza, presenta un messaggio "Hai inserito una vecchia password - riprova" o un codice di errore in tal senso (quindi quando ti contattano, puoi chiedere "Vedi il codice di errore 47? Significa che hai ha usato una vecchia password. ")

In questo modo, puoi essere abbastanza sicuro che il sistema di login funzioni poiché ha effettuato almeno alcune ricerche di password e l'utente riceve un feedback sul fatto che ha dimenticato la nuova password.

Tuttavia, ciò introdurrebbe anche un difetto nell'enumerazione degli utenti: se un database delle password viene scaricato e l'utente cambia la password in seguito a ciò, un utente malintenzionato con il dump può comunque confermare che l'utente esiste.Se ottengono solo l'errore standard, non possono dirlo una volta che la password è stata modificata.È una possibilità sottile, ma comunque.
Questo sacrifica un po 'di sicurezza.C'è una discussione più dettagliata qui: [La memorizzazione di vecchie password da parte di Facebook compromette la sicurezza?] (Http://security.stackexchange.com/questions/137641/does-facebook-storing-old-passwords-compromise-security)
Bryan Field
2016-11-11 00:58:49 UTC
view on stackexchange narkive permalink

Sto postando una seconda risposta a cui pensavo ieri, ma non ero sicuro che fosse consigliabile.

Potresti creare un registro temporaneo delle password impostate / reimpostate e tentate in forma crittografata. Gli esperti di sicurezza (me compreso) rabbrividirebbero all'idea di crittografare (invece di hashing) le password (o anche i tentativi di password errate), quindi suggerirei tre precauzioni se decidi di iniziare a registrare queste informazioni.

  1. Invia le informazioni a un computer separato / isolato in modo che, se il server principale è compromesso, il registro delle password è ancora al sicuro.
  2. Utilizza la chiave pubblica (asimmetrica ) crittografia per le informazioni registrate. La chiave privata (decrittografia) viene archiviata solo in un ambiente isolato affinché lo sviluppatore possa rivedere i dati registrati.
  3. Pianifica un'attività (o inseriscila nel codice) in modo che questo log temporaneo sia disabilitato in una determinata data o quando un numero sufficiente di test ha avuto esito positivo.
Non sono sicuro che sacrificare la sicurezza di tutti solo per dimostrare che alcune persone stupide si sbagliano sia una buona idea.Questo è un rischio enorme, anche se vengono prese tutte le precauzioni.Anche dalla domanda sembra che il servizio clienti avrebbe bisogno di accedere a queste informazioni, quindi potrebbero non essere affidabili come gli sviluppatori.Infine il test del sistema di password può (e dovrebbe) essere fatto con test unitari su un database demo.
Seguendo le precauzioni 1 e 2 questo può essere un rischio accettabile, a condizione che il termine isolato venga seguito attentamente.(ad es. computer senza accesso diretto a Internet e solo pochi servizi di rete selezionati da utilizzare per un singolo sviluppatore) Potrebbe essere una tentazione scivolosa.Ovviamente renderli disponibili al servizio clienti sarebbe un rischio enorme!(cioè non sarebbe molto ben isolato)
Se hai intenzione di fare qualcosa di simile, metti un campo nel file che dice se tale registrazione deve essere utilizzata e attivala solo sulle persone che si lamentano.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...