Un 'if password == XXXXXXX' è sufficiente per la minima sicurezza?


20

Se creo un account di accesso per un'app che presenta un rischio di sicurezza medio-basso (in altre parole, non è un'app bancaria o altro), è accettabile per me verificare una password inserita dall'utente semplicemente dicendo qualcosa come:

if(enteredPassword == verifiedPassword)
     SendToRestrictedArea();
else
     DisplayPasswordUnknownMessage();

Sembra facile essere efficace, ma certamente non mi dispiacerebbe se fosse tutto ciò che era richiesto. È sufficiente un semplice controllo su combo nome utente / password?

Aggiornamento: il particolare progetto sembra essere un servizio Web, la verifica è interamente lato server e non è open-source. Il dominio cambia il modo in cui lo affronteresti?


3
dipende da dove proviene validPassword? se è hardcoded non sarai in grado di configurare / cambiare la password senza cambiare il codice. Se proviene da un file di configurazione, sarà visibile a chiunque vi acceda.
Alb

1
"è sufficiente un controllo su combo nome utente / password" per fare cosa?
Chris,

3
@opinion: sembra improbabile che questo sia PEGGIORE che non avere un login. Si prega di fornire alcuni ragionamenti per un reclamo così forte.
Morgan Herlocker,

1
La tua terminologia non è corretta, quando stai confrontando una password la stai verificando, non assicurandoti che sia valida. Si prega di prendere il tempo per capire la differenza.
billy.bob,

1
Ciò implica l'archiviazione della password in testo normale, il che è irresponsabile. Implica anche avvisare un utente che la password era errata, il che fornisce a un potenziale aggressore troppe informazioni. Dovresti essere sempre ambiguo, ad es. "Login o password errati".
Rein Henrichs,

Risposte:


26

Non senza SSL

Ciò non è sicuro se la password viene inviata in rete in testo semplice. Anche l'hash della password sul lato server non è sicuro se la password viene inviata sulla rete in testo semplice.

Poiché il <input type="password"/>tag HTML invia i suoi contenuti in testo semplice, questo sarà un problema, indipendentemente dal modo in cui memorizzi la password sul server, a meno che il tuo sito web non utilizzi SSL per trasmettere la password.

(L'autenticazione HTTP, che apre una finestra di dialogo nel browser che richiede una password, può essere o meno un testo chiaro, a seconda dei meccanismi di autenticazione che il server e il browser hanno in comune. Quindi potrebbe essere un modo per evitarlo senza usare SSL).

Non se gli amministratori del sito sono sospetti

Ora, supponendo che tu stia usando HTTPS per fare il sito web, questo potrebbe essere sicuro se ti fidi dei tuoi amministratori del sito (che possono leggere password di testo semplice) e di altre persone che hanno accesso alla macchina per comportarsi correttamente. Ora, può essere ovvio che possono fare tutto ciò che vogliono con il tuo sito Web (dal momento che lo gestiscono), ma se sono in grado di leggere la password, potrebbero anche essere in grado di utilizzare le coppie di login / password rubate sui siti di altre persone.

Un modo che protegge le password dall'amministratore

Un modo sicuro per archiviare e controllare le password è il seguente:

def change_password user, new_password
  salt = random(65536).to_s(16) #will be 4 characters long
  password_hash = salt + hash(salt + new_password)
  store(user,password_hash)
end

def does_password_match? user, entered_password
  correct_password_hash = retrieve(user)
  salt = correct_password_hash[0...4]
  entered_password_hash = salt + hash(salt + entered_password)
  return correct_password_hash == entered_password_hash
end

Per la funzione hash, prova a usare qualcosa di forte e qualcosa che non ha ancora buoni tavoli arcobaleno in natura. È possibile modificare la lunghezza del sale, se necessario, aggirare i tavoli arcobaleno.

A seconda dell'ambiente in cui ci si trova, della variabilità della latenza della rete e del fatto che i nomi degli utenti siano noti pubblicamente, è possibile che sia necessario calcolare un altro percorso del codice hash('0000'+entered_password)se l'utente non esiste, al fine di impedire agli aggressori di determinare quali nomi utente sono validi in base al tempo impiegato determina che la password non è corretta.


1
Buoni consigli :) Per quanto riguarda SSL, ci è stato richiesto di progettare qualcosa che avrebbe funzionato in natura e abbiamo semplicemente usato la crittografia asimmetrica per codificare la password (richiede Javascript) e quindi decodificarla sul server. L'hash salt + si verifica quindi normalmente. Inoltre, poiché la chiave pubblica viene inviata con la pagina Web, può cambiare arbitrariamente spesso.
Matthieu M.,

1
@Matthieu M .: Quando qualcuno può falsificare la tua pagina web, può anche cambiare la chiave pubblica lì in una dove conosce lui stesso la chiave privata corrispondente. Quindi la tua idea aiuta solo contro gli attacchi di lettura passivi, non contro l'uomo nel mezzo.
Paŭlo Ebermann,

@Paulo: sì, sono d'accordo che SSL non riguarda solo la crittografia, ma anche il certificato, sfortunatamente non chiamo i colpi qui, e quando le persone dicono di voler usare la pagina web con una http://connessione regolare ... è frustrante: /
Matthieu M.

@Matthieu: significa che stai inviando public_key come parte della pagina web pubblica, elaborando encrypt(entered_password, public_key)sul client e inviando quel risultato al server, che esegue does_password_match?(user, decrypt(encrypted_password, private_key))?
Ken Bloom,

@Ken: più o meno, hai ottenuto la crittografia corretta. Per abbinare la password è di più does_password_match(user, salt, decrypt(encrypted, key)), con il sale a seconda dell'utente. Come ho detto, l'ovvia questione è la mancanza di protezione man-in-the-middle.
Matthieu M.,

52

Ciò suggerirebbe che stai mantenendo le password in testo aperto, il che è un no-no, anche in scenari a bassa sicurezza.

Dovresti piuttosto avere:

if(hash(enteredPassword) == storedHash)

Puoi usare un hash semplice come ad esempio MD5


22
+1 per l'hashing della password. Ma almeno aggiungerei anche un po 'di sale. Altrimenti, poiché gli utenti riutilizzeranno nomi utente e password tra i sistemi, la violazione dell'app a bassa sicurezza potrebbe consentire a un utente malintenzionato di violare un'app di sicurezza molto più elevata. Il recente hack di HBGary, ad esempio, è riuscito a compromettere il sistema CMS che esegue il loro sito Web e trasformarlo in accesso root ai loro server in parte perché il sistema CMS a bassa sicurezza non stava aggiungendo sale agli hash arstechnica.com/tech-policy/ news / 2011/02 /…
Grotta di Giustino

1
Accetto ... considera quanto segue .. "stringhe JavaFile.class | grep -i password"
Bill

Qual è il problema con avere la password in testo normale se vengono utilizzati una sola volta?

10
@Tim perché gli utenti non useranno la password una sola volta. Gli studi dimostrano costantemente che gli utenti riutilizzano le password più volte (ad es. Theregister.co.uk/2011/02/10/password_re_use_study ), indipendentemente dal numero di volte in cui viene loro chiesto di non farlo.
Scott,

3
@Tim: inoltre, apri il tuo exe, dll, ecc. In un editor di testo e probabilmente vedrai la tua password proprio lì.
Gus Cavalcanti,

14

Concordo con coloro che suggeriscono l'hashing, ma c'è anche una ruota che stai reinventando qui. A seconda della piattaforma, è possibile trovare probabilmente uno strumento di gestione ruoli / utenti che copre tutte le attività di gestione degli utenti in modo sicuro e senza richiedere troppo intervento da parte dell'utente.


Ho appena scoperto i provider di appartenenze ASP.Net ma li guardavo pensando "quante volte ho perso tempo a implementare qualcosa del genere?"
glenatron,

8

La sicurezza è un argomento molto delicato, in particolare perché deve esserci un equilibrio tra l'inconveniente degli utenti e la sicurezza delle loro informazioni. In genere, la formula per quanta sicurezza è necessaria dipende dall'importanza dei dati. In breve:

isSecuritySufficient = effortToBreak > rewardForBreaking

Un comune malinteso sulle persone che fanno cose cattive è quello che stanno cercando. Molti di loro cercano di distruggere la fiducia . Dovresti sempre fare tutto il possibile per proteggere la fiducia dei tuoi utenti. Parte di ciò sta facendo la dovuta diligenza per assicurarsi che la loro identità sia sicura. A loro potrebbe interessare di meno i dati che memorizzano, ma a loro importa della loro identità, anche alla soglia di sicurezza più bassa.

Sono disponibili numerose opzioni a basso costo (da implementare e di impatto per l'utente). Uno di questi è l'hashing della password al minimo indispensabile. Qualsiasi servizio che memorizza qualcosa di sensibile come una password in testo normale merita l'imbarazzo di essere violato.

Principi generali per la protezione con password

  • Non archiviare mai le password in testo semplice
  • Hash usando una funzione hash sicura come SHA-1 o persino SHA-512 (anche MD5 è troppo facile per trovare un hash corrispondente)
  • Utilizzare un valore sale dell'applicazione. Il salt è byte casuali o aggiunti a una password per rendere più difficile indovinare. Il sale deve essere generato in fase di esecuzione e utilizzando le informazioni sulla macchina come valore seme anziché archiviato e referenziato in alcun modo.
  • Utilizzare un valore salato specifico dell'utente. Utilizzare questo in combinazione con il sale dell'applicazione.
  • Crittografa tutte le richieste di autenticazione che vanno su una rete. Ciò significa che utilizzare SSL per le applicazioni Web.

Dal momento che useresti SSL per l'autenticazione, come minimo vuoi crittografare tutte le pagine che trattano anche dell'account dell'utente. Ciò consente di proteggere il più possibile l'identità di un utente.

Una nota sulla gestione delle password : gli utenti dimenticano di tanto in tanto la propria password. La cosa peggiore in assoluto che puoi fare è inviare loro la password in un'e-mail. Se si implementano i principi di cui sopra, non si sarà in grado di farlo comunque. È molto meglio fornire un modo per reimpostare la password usando un collegamento inviato al loro indirizzo e-mail registrato. Quel link di reimpostazione avrà un codice di utilizzo una tantum per garantire che sia la persona che accede alla pagina.


1
All'inizio sono rimasto davvero colpito dall'idea dell'applicazione salt + user salt, ma più ci penso, meno sono convinto. Se hai usato, diciamo, 4 caratteri di sale applicazione e 4 di sale utente, la differenza tra quello e 8 caratteri di sale utente è solo che metà del sale sarebbe identica per ogni utente. Sembrerebbe che sarebbe più sicuro aumentare solo le dimensioni del sale dell'utente, anziché avere il sale dell'applicazione. Inoltre, se l'applicazione sale si basa sull'hardware, non è possibile aggiornare o modificare l'hardware senza invalidare tutte le password.
David Conrad,

Il problema è che l'utente salt è incluso nella riga del database con la password dell'utente. Se una persona cattiva sa a cosa serve (e lo fa) un sale e lo vede nel database, allora sa come spezzarlo completamente. Includendo una parte nell'applicazione che viene calcolata (allo stesso modo ogni volta che ti dispiace) invece che memorizzata, rende molto più difficile decifrare le tabelle utente. Ovviamente puoi fare un ulteriore passo avanti e creare un sale casuale puro di 1 parte e un sale calcolato di 1 parte con entrambi specifici dell'utente.
Berin Loritsch,

Ah, vedo, mantieni parte del sale fuori dal database. Questo ha senso. Grazie.
David Conrad,

Non vedo problemi a memorizzare il sale per riga, purché sia ​​unico per riga. Ecco un hash: "fd84235a55bbfeb1585a3dd069d48127989c9753058b51b6ba2056fd6c5a0a91" (SHA256), ecco il sale: "671254bdf7944f8fa88e6c9913b948ee". Pensi di poter ottenere la password? Non esiste un tavolo arcobaleno per quel sale (anche se ti viene dato il sale), sei bloccato a forza bruta.
Bryan Boettcher,

3

Va bene a meno che la password non venga utilizzata per qualcos'altro. Esiste ancora il rischio che l'utente decida di poter riutilizzare la password, quindi sarebbe ancora meglio con:

if(hash(enteredPassword) == hashOfValidPassword)

Se è per te o qualcuno che è consapevole che la password è memorizzata in testo normale, allora va bene.


1
Come nel commento di Justin Cave alla risposta di Vartec, usa il sale, quindi if (hash (enteredPassword + salt) == hashOfValidSaltedPassword)- e nota che +probabilmente si tratta di concatenazione, non di aggiunta. Questo ostacola davvero l'uso delle tabelle arcobaleno, che sono tabelle di hash di password probabili.
David Thornley,

se tutto ciò che stai cercando è un hash, non potrebbero semplicemente passare attraverso un ciclo di stringhe possibili fino a quando non si genera lo stesso hash dell'hash memorizzato? Dopotutto, ci sono molte stringhe che potrebbero corrispondere allo stesso hash.
Morgan Herlocker,

@Prof Plum: è molto difficile trovare collisioni se l'algoritmo di hashing è buono. Questa è la base della crittografia moderna: sono essenzialmente funzioni a senso unico.

3

Il codice sorgente è disponibile? Anche in caso contrario, sono abbastanza sicuro che la password potrebbe essere trovata nelle istruzioni della macchina nel caso in cui il binario sia disponibile. Consiglierei di fare un checksum e confrontarlo invece.

Non trascurare mai la sicurezza anche se secondo te non è molto importante.


2
Sì, cattiva idea se si tratta di un progetto open source :)

-1 - Se pensi che avere la fonte faccia la differenza, non sai nulla della sicurezza.
Mattnz,

1

Assolutamente no. Avere una lettura di questo , si descrive come gli hacker violato un sito web di sicurezza. Il tuo piano ti avrebbe come l'anello più debole della catena.


0

È stato notato in un paio di risposte che non dovresti memorizzare la password stessa, ma un hash - e dovresti usare SSL.

Potresti dire, qual è il grosso problema? Se la mia applicazione viene hackerata, questo è poco preoccupante. Bene, è un modello abbastanza comune per gli utenti di riutilizzare la stessa password su tutti i siti. Se fosse un hacker per hackerare il tuo sito e ottenere l'accesso alle password degli utenti, l'hacker sarebbe stato in grado di impersonare molti di quegli utenti su altri siti di maggiore importanza per quegli utenti. Quindi l' hacking del tuo sito potrebbe essere il primo passo per un hacker per ottenere l'accesso alle informazioni bancarie per gli utenti.

E l'hashing della password non è sufficiente. Devi frullarlo con un sale. Gli hacker hanno tabelle di ricerca hash inversa, quindi per un dato hash possono trovare una password corrispondente.

Se si sceglie di non implementare queste funzionalità, è necessario informare gli utenti di questa mancanza di sicurezza, incoraggiandoli a non utilizzare la stessa password utilizzata altrove.


-2

Finché si tratta del lato server .. Quindi sì.

Se vuoi un po 'più di sicurezza vai su https e crittografa \ hash la password nel DB.


3
Perché presumere che si tratti di un'app Web?
Chris,

Buon punto! L'ho appena fatto.
Morons,

4
-1 anche se è lato server, questo non è ancora corretto.
GSto
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.