1. Archiviazione della password (nel modo corretto):
* Hashing: Invece di archiviare direttamente la password dell'utente, il sistema memorizza un hash * crittografico * della password. Un hash è una funzione a senso unico; È facile calcolare l'hash dalla password, ma praticamente impossibile derivare la password originale dall'hash.
* Salting: Per migliorare ulteriormente la sicurezza, un * sale casuale * viene aggiunto alla password prima dell'hashing. Il sale è una stringa di caratteri unica e generata casualmente. Ciò rende molto più difficile per gli aggressori utilizzare tabelle hash pre-computate (tabelle arcobaleno) per rompere le password, anche se ottengono l'accesso al database.
* Il `Salt` è in genere archiviato insieme alla password` Hash` nel record dell'utente.
* Algoritmi di hashing forti: I sistemi moderni utilizzano robusti algoritmi di hashing come:
* bcrypt: Algoritmo di hashing adattivo che è lento e computazionalmente costoso, rendendo molto resistente agli attacchi a forza bruta. Include la generazione di sale e lo stoccaggio all'interno dell'hash stesso.
* Argon2: Un algoritmo di hashing più moderno e duro, spesso considerato il successore di BCrypt.
* Scrypt: Un'altra funzione di derivazione chiave progettata per essere intensiva dal punto di vista computazionale, rendendo più difficile rompere le password.
2. Processo di accesso/autenticazione:
1. Input utente: L'utente inserisce il proprio nome utente e password nel modulo di accesso.
2. Recupera il sale: Il sistema recupera il * sale * associato al nome utente inserito dal database utente.
3. Hashing con sale: Il sistema prende la password inserita dall'utente e il sale *recuperato *, li combina e quindi applica lo stesso algoritmo di hashing utilizzato quando la password era originariamente memorizzata.
4. Confronto: L'hash risultante dal passaggio 3 viene confrontato con l'hash password memorizzato per quell'utente nel database.
5. Verifica:
* Se i due hash corrispondono: È molto probabile che l'utente abbia inserito la password corretta. L'utente è autenticato e viene stabilita una sessione.
* Se gli hash non corrispondono: La password inserita non è corretta. All'utente viene negato l'accesso e in genere riceve un messaggio di errore.
Perché questo è sicuro:
* Nessuna password in chiaro: Il sistema * non * mai * memorizza la password effettiva in testo in chiaro, quindi anche se il database è compromesso, gli aggressori non avranno accesso diretto alle password.
* Il sale impedisce gli attacchi del tavolo arcobaleno: Il sale unico per ciascun utente produce tabelle arcobaleno (tabelle hash pre-computate) inefficaci. Un utente malintenzionato dovrebbe generare un tavolo arcobaleno per * ciascuno * sale, che è proibitivo computazionalmente.
* Hashing lento impedisce gli attacchi di forza bruta: Gli algoritmi di hashing moderni (come BCrypt, Argon2 e Scrypt) sono deliberatamente progettati per essere lenti. Ciò significa che un aggressore non può provare rapidamente un gran numero di ipotesi di password.
Esempio di codice (concettuale - python con bcrypt):
`` `Python
Importa bcrypt
def hash_password (password):
"" "Hash una password utilizzando BCrypt con un sale generato casualmente." ""
# Genera un sale
Salt =bcrypt.gensalt ()
# Hash la password utilizzando il sale
hashed_password =bcrypt.hashpw (password.encode ('utf-8'), sale)
restituire hashed_password, sale #return sia l'hash che il sale in modo che il sale possa essere conservato con l'hash
DEF Verify_Password (Ented_Password, Stored_hash, Stored_Salt):
"" "Verifica se la password inserita corrisponde all'hash memorizzato." ""
# Hash la password inserita con il sale memorizzato
hashed_entered_password =bcrypt.hashpw (Ented_password.encode ('UTF-8'), Stored_Salt)
# Confronta l'hash generato con l'hash immagazzinato
return hashed_entered_password ==stored_hash
Password ="MySECRETPassword123"
hashed_password, salt =hash_password (password)
Entered_Password ="MySECRETPassword123" #USER fornisce durante l'accesso
Stored_hash =b '$ 2b $ 12 $ EK11WE0GJ8DK9J7CQH9YOC9/S8/6RXLG13N/L604QG1V14K6YDNA' # Esempio - memorizzato da sopra
Stored_salt =b '$ 2b $ 12 $ EK11WE0GQJ8DK9J7CQH9YO' # Esempio - memorizzato dall'alto
Se Verify_Password (Ented_Password, Stored_hash, Stored_Salt):
Stampa ("Verificata password! Accedi di successo")
altro:
Stampa ("Password errata. Accedi non riuscita.")
`` `
Considerazioni importanti:
* Complessità della password: Applicare le regole di complessità della password (lunghezza minima, caratteri richiesti) per rendere le password più difficili da indovinare.
* Limitazione della velocità: Implementare la velocità di limitazione dei tentativi di accesso per prevenire gli attacchi di forza bruta. Blocca i conti dopo un certo numero di tentativi non riusciti.
* Autenticazione a due fattori (2FA): Usa 2FA per un ulteriore livello di sicurezza. Anche se la password è compromessa, un utente malintenzionato avrà comunque bisogno di un secondo fattore (ad esempio un codice da un'app mobile).
* Audit di sicurezza regolari: Condurre audit di sicurezza regolari per identificare e affrontare potenziali vulnerabilità.
* Mantieni le librerie aggiornate: Mantieni aggiornate le librerie e le dipendenze di hashing per beneficiare delle ultime patch di sicurezza.
* Meccanismi di reimpostazione della password: Implementare i meccanismi di reimpostazione della password sicuri utilizzando le domande di verifica e sicurezza e -mail.
Utilizzando questi principi, i sistemi possono verificare efficacemente le password proteggendo i dati dell'utente dal compromesso. È un aspetto cruciale della sicurezza generale.
Domanda © www.354353.com