A che serve fare in modo che gli utenti usino le cifre, una combinazione maiuscola e una minuscola se le password sono sottoposte a hash?

-3

Alcuni siti Web, anche StackOverflow richiede la presenza di almeno 1 cifra, 1 carattere maiuscolo nella password. Questo è davvero importante quando lo sviluppatore utilizza un algoritmo di hash delle password per memorizzare le password nel database?

Sto costruendo un progetto in cui la sicurezza conta davvero, ma gli utenti sono testardi di usare password deboli. Voglio motivarli a utilizzare password complesse utilizzando regole che contano davvero e educandole sulle ragioni di tali requisiti.

È sufficiente prevenire i numeri di telefono, il proprio nome o le parole del dizionario? Perché no?

    
posta Mr. Alien 18.01.2013 - 09:24
fonte

3 risposte

6

Indipendentemente dall'hashing, la debolezza intrinseca delle password è che vengono scelte e ricordate dagli umani. Gli umani non sono bravi in questi lavori. Sceglieranno e ricorderanno le password da un insieme piuttosto ristretto di possibili password, ovvero parole che "hanno senso" in un modo o nell'altro. Un utente malintenzionato con un computer può provare tutte le "password plausibili" alla velocità del suo computer , che può essere diabolicamente veloce a quel lavoro (fino a diversi miliardi al secondo con un PC di gioco disponibile in commercio ). Questo è chiamato attacco dizionario .

Richiedere l'aggiunta di una cifra e un mix di lettere maiuscole / minuscole è un tentativo di costringere gli utenti umani ad ampliare la propria serie di possibili password. Esistono più password possibili composte da una parola significativa + una cifra, rispetto alle possibili password costituite da una parola significativa (esattamente dieci volte di più, in realtà).

(Tali regole spesso si ritorcono contro il fuoco. Quando chiedi una cifra in più, la maggior parte degli utenti aggiungerà un "1" e lo aggiungerà alla fine, il che significa che non c'è alcun ingrandimento del set di password possibili e la lunghezza extra incita gli utenti scegliere una parola più breve da una lista più breve, quindi ridurre la dimensione del set di potenziali password.)

Hashing è un sistema di difesa di secondo livello, pensato per contrastare gli aggressori che potrebbero parzialmente fare breccia nel server e ottenere un picco nel database delle password memorizzate. La dimensione del set di potenziali password è importante indipendentemente dall'hashing. Quando l'utente malintenzionato ha accesso alla password con hash, può semplicemente eseguire un attacco di dizionario offline , dove ogni "tentativo" è solo una questione di calcolo della funzione hash. Questo rende l'attività più semplice per l'utente malintenzionato (invece di dover parlare con il server per ogni tentativo, che è un attacco del dizionario online ) ma non cambia il concetto di base, che è quello che gli utenti dovrebbero usare password da un grande set.

    
risposta data 27.02.2013 - 19:21
fonte
1

La complessità aggiunge ancora sicurezza. @Thomas Pornin ha ragione nella sua risposta, ma mi piacerebbe fornire un modo diverso di pensarci.

Supponiamo che stiamo facendo l'hashing. Quanto è resistente all'attacco

  1. Superiore / inferiore / speciale / simboli (circa 84 valori potenziali IIRC)?
  2. Superiore / inferiore / numeri (64 simboli)?
  3. Numeri esadecimali (16 simboli)?
  4. Numeri decimali (10 simboli)?
  5. numeri binari (2 simboli)?

Ovviamente il caso n. 5 è reductio ad absurdium; tutti dovrebbero accettare che 2 simboli sono insufficienti. Vogliamo che il set di simboli sia tanto complesso quanto possiamo farlo senza imporre una penalità indebita agli utenti o ad altri elementi del sistema.

    
risposta data 27.02.2013 - 19:55
fonte
1

Ci sono tre tipi principali di attacco che possono essere eseguiti contro gli hash: attacchi a forza bruta, attacchi a dizionario e attacchi pre-calcolo.

Attacchi a forza bruta
Un attacco a forza bruta comporta la selezione di un intervallo di caratteri (ad esempio lettere minuscole e numeri) e il calcolo dell'hash per ogni singola permutazione possibile di quei caratteri, per un intervallo di lunghezze della password. Ogni hash viene confrontato con il tuo hash di destinazione e, se corrisponde alla password, è stato trovato. Ad esempio, potremmo scegliere a-z A-Z 0-9 come nostro alfabeto per le password tra 5 e 8 caratteri. La difesa da tali attacchi dipende dal costo computazionale di ogni operazione di hash, dall'alfabeto necessario per attaccare con successo la password e dalla lunghezza della password. Poiché la tecnologia moderna consente l'accelerazione basata su GPU dell'hash, è importante utilizzare una funzione di derivazione a chiave lenta (ad esempio PBKDF2 o bcrypt) invece di un singolo hash.

Attacchi dizionario Gli attacchi di dizionario implicano l'esecuzione di un ampio elenco di parole preselezionate che probabilmente devono essere utilizzate come password. È importante notare che la maggior parte dei dizionari non include solo parole di dizionario reali, ma include anche varie pseudo parole e altri valori che si trovano in varie perdite di database e elenchi di password comuni. Questi attacchi sono più efficienti degli attacchi a forza bruta in generale, perché si concentrano sui tipi di password che gli umani scelgono piuttosto che su valori completamente casuali. La difesa da tali attacchi si basa quasi interamente sul non raccogliere una password o una parola del dizionario comuni.

Attacchi pre-computazione
Invece di calcolare gli hash ripetutamente e confrontarli con l'hash di destinazione, gli attacchi di pre-computazione comportano l'hash di calcolo per un insieme di valori scelti (come un attacco di dizionario) e la memorizzazione in un file o database. I database hash e le tabelle arcobaleno sono due metodi comuni per farlo. Ciò fornisce una ricerca molto rapida di testo in chiaro per qualsiasi hash noto, poiché si tratta solo di cercare l'hash nell'indice e restituire il testo in chiaro associato. Questo può essere difeso usando un sale, cioè un valore casuale aggiunto alla password prima dell'hash. Ciò rende le tabelle di calcolo arcobaleno per ogni possibile valore di sale completamente irrealizzabile.

Quindi, perché le password complicate sono importanti? Dipende, davvero. Se stai eseguendo correttamente l'hashing della password, utilizzando PBKDF2 o bcrypt con un ragionevole fattore di costo, la complessità oltre a non utilizzare le password comuni non è effettivamente così importante. È più importante evitare parole del dizionario e password comuni, e le password complesse di solito offrono quel tipo di protezione. Tuttavia, la scelta di una password lunga e insolita senza dizionario è memorabile (ad esempio PolynomialLovesBacon ) funziona altrettanto bene. Se esegui l'hashing della password in modo errato (ad es. SHA1 salato) hai bisogno di una password molto più sicura per rimanere al sicuro, perché le GPU possono calcolare decine di miliardi di hash al secondo.

Naturalmente, dovrai affrontare gli aspetti umani. Penso che una delle cose migliori che puoi fare sia warn utenti se usano una password comune, memorizzando un elenco dei ~ 2000 più comuni (puoi ottenere liste di questi online) e controllare loro. Fintanto che le password di hashing sono corrette, la maggior parte degli utenti dovrebbe essere ragionevolmente al sicuro anche in caso di perdita di un database.

La maggior parte di questi attacchi si basa sul modello del tuo sito che viene violato e le tue password rubate, ad es. tramite l'iniezione SQL, quindi è importante aderire alle pratiche di codifica sicure ed essere consapevoli delle vulnerabilità comuni.

Ulteriori letture:

risposta data 27.02.2013 - 19:59
fonte

Leggi altre domande sui tag