Sicuro hash e sale per le password di PHP


Answers

Una risposta molto più breve e più sicura : non scrivere affatto il meccanismo della password , utilizzare un meccanismo collaudato.

La maggior parte dei programmatori semplicemente non ha le competenze per scrivere codice relativo alla crittografia senza introdurre vulnerabilità.

Autotest rapido: cos'è lo stretching della password e quante iterazioni dovresti usare? Se non conosci la risposta, dovresti usare password_hash() , poiché l'estensione della password è ora una caratteristica critica dei meccanismi delle password dovuta a CPU molto più veloci e all'uso di GPU e FPGA per decifrare le password a un tasso di miliardi di ipotesi al secondo (con GPU).

Ad esempio, è possibile decifrare tutte le password di Windows a 8 caratteri in 6 ore utilizzando 25 GPU installate in 5 PC desktop. Questo è brute-forcing cioè enumerare e controllare ogni password di Windows di 8 caratteri , inclusi caratteri speciali, e non è un attacco di dizionario. Era il 2012, dal 2018 potresti utilizzare un minor numero di GPU o craccare più velocemente con 25 GPU.

Ci sono anche molti attacchi rainbow table su password di Windows che girano su CPU ordinarie e sono molto veloci. Tutto ciò è dovuto al fatto che Windows non salta o non allunga le sue password, anche in Windows 10 - non commettere lo stesso errore di Microsoft!

Guarda anche:

  • risposta eccellente con ulteriori informazioni sul perché password_hash() o phpass sono il modo migliore per andare.
  • buon articolo del blog che fornisce "fattori di lavoro" raccomandati (numero di iterazioni) per i principali algoritmi inclusi bcrypt, scrypt e PBKDF2.
Question

Attualmente è stato detto che MD5 è parzialmente insicuro. Tenendo conto di ciò, mi piacerebbe sapere quale meccanismo utilizzare per la protezione con password.

Questa domanda è "double hashing" una password meno sicura rispetto alla semplice hashing di una volta? suggerisce che l'hashing di più volte può essere una buona idea, mentre come implementare la protezione con password per i singoli file? suggerisce di usare il sale.

Sto usando PHP. Voglio un sistema sicuro e veloce di crittografia delle password. Macinare una password un milione di volte può essere più sicuro, ma anche più lento. Come raggiungere un buon equilibrio tra velocità e sicurezza? Inoltre, preferirei che il risultato avesse un numero costante di caratteri.

  1. Il meccanismo di hashing deve essere disponibile in PHP
  2. Deve essere al sicuro
  3. Può usare il sale (in questo caso, tutti i sali sono ugualmente buoni? C'è un modo per generare dei buoni sali?)

Inoltre, dovrei memorizzare due campi nel database (uno usa MD5 e un altro usando SHA, per esempio)? Lo renderebbe più sicuro o meno sicuro?

Nel caso in cui non fossi abbastanza chiaro, vorrei sapere quali funzioni di hashing usare e come scegliere un buon sale per avere un meccanismo di protezione della password sicuro e veloce.

Domande correlate che non coprono la mia domanda:

Qual è la differenza tra SHA e MD5 in PHP
Crittografia semplice password
Metodi sicuri di memorizzazione delle chiavi, password per asp.net
Come implementeresti le password salate in Tomcat 5.5




ok in the fitsy we need salt salt must be unique so let generate it

   /**
     * Generating string
     * @param $size
     * @return string
     */
    function Uniwur_string($size){
        $text = md5(uniqid(rand(), TRUE));
        RETURN substr($text, 0, $size);
    }

also we need the hash I`m using sha512 it is the best and it is in php

   /**
     * Hashing string
     * @param $string
     * @return string
     */
    function hash($string){
        return hash('sha512', $string);
    }

so now we can use this functions to generate safe password

// generating unique password
$password = Uniwur_string(20); // or you can add manual password
// generating 32 character salt
$salt = Uniwur_string(32);
// now we can manipulate this informations

// hashin salt for safe
$hash_salt = hash($salt);
// hashing password
$hash_psw = hash($password.$hash_salt);

now we need to save in database our $hash_psw variable value and $salt variable

and for authorize we will use same steps...

it is the best way to safe our clients passwords...

Ps for last 2 steps you can use your own algorithm... but be sure that you can generate this hashed password in the future when you need to authorize user...




COSE DA RICORDARE

Molto è stato detto sulla crittografia della password per PHP, la maggior parte dei quali è un ottimo consiglio, ma prima ancora di iniziare il processo di utilizzo di PHP per la crittografia della password assicurati di avere implementato o pronto per essere implementato.

SERVER

PORTS

Non importa quanto sia buona la crittografia se non si protegge adeguatamente il server che esegue PHP e DB, tutti i vostri sforzi sono inutili. La maggior parte dei server funziona in modo simile, hanno porte assegnate per permetterti di accedervi da remoto tramite ftp o shell. Assicurati di cambiare la porta predefinita di cui hai mai attivato la connessione remota. In caso contrario, in effetti l'utente malintenzionato ha fatto un passo in meno nell'accedere al sistema.

NOME UTENTE

Per tutto ciò che è buono al mondo non utilizzare il nome utente admin, root o qualcosa di simile. Inoltre, se si è su un sistema basato su UNIX, NON rendere accessibile l'accesso all'account root, dovrebbe sempre essere solo sudo.

PAROLA D'ORDINE

Dì ai tuoi utenti di fare delle buone password per evitare di essere violati, fare lo stesso. Qual è il punto in cui passa tutto lo sforzo di bloccare la porta principale quando hai la backdoor spalancata.

BANCA DATI

SERVER

Idealmente si desidera il DB e l'APPLICAZIONE su server separati. Ciò non è sempre possibile a causa dei costi, ma consente una certa sicurezza in quanto l'utente malintenzionato dovrà eseguire due passaggi per accedere completamente al sistema.

UTENTE

Fai in modo che l'applicazione disponga di un proprio account per accedere al DB e fornisca solo i privilegi necessari.

Quindi avere un account utente separato per te che non è memorizzato da nessuna parte sul server, nemmeno nell'applicazione.

Come sempre NON fare questa radice o qualcosa di simile.

PAROLA D'ORDINE

Seguire le stesse linee guida di tutte le password valide. Inoltre, non riutilizzare la stessa password su qualsiasi account SERVER o DB sullo stesso sistema.

PHP

PAROLA D'ORDINE

MAI MAI memorizzare una password nel DB, invece memorizzare l'hash e il sale unico, spiegherò perché dopo.

hashing

ONE WAY HASHING !!!!!!!, Mai hash una password in modo che possa essere invertita, Hash dovrebbe essere unidirezionale, nel senso che non li si inverte e li si confronta con la password, invece si hash la password inserita allo stesso modo e confrontare i due hash. Ciò significa che anche se un utente malintenzionato accede al DB, non sa quale sia la vera password, ma solo il suo hash risultante. Il che significa maggiore sicurezza per i tuoi utenti nel peggiore scenario possibile.

Esistono molte buone funzioni di hashing ( password_hash , hash , ecc ...) ma è necessario selezionare un buon algoritmo affinché l'hash sia efficace. (bcrypt e quelli simili ad esso sono algoritmi decenti).

Quando la velocità di hashing è la chiave, tanto più lento è il più resistente agli attacchi di forza bruta.

Uno degli errori più comuni nell'hashing è che gli hash non sono unici per gli utenti. Ciò è principalmente dovuto al fatto che i sali non sono generati in modo univoco.

SALATURA

Le password devono essere sempre salate prima dell'hash. Salting aggiunge una stringa casuale alla password in modo che password simili non appaiano uguali nel DB. Tuttavia, se il sale non è univoco per ogni utente (ad esempio: si utilizza un sale codificato duro) di quanto tu abbia praticamente reso il tuo sale senza valore. Perché una volta che un utente malintenzionato calcola una password, ha il sale per tutti loro.

Quando crei un sale, assicurati che sia univoco per la password che sta salendo, quindi memorizza sia l'hash completato che il sale nel tuo DB. Ciò che questo farà sarà fare in modo che un attaccante debba crackare singolarmente ogni sale e hash prima che possano accedervi. Questo significa molto più lavoro e tempo per l'attaccante.

UTENTI CHE CREANO PASSWORD

Se l'utente sta creando una password attraverso il frontend significa che deve essere inviata al server. Questo apre un problema di sicurezza perché significa che la password non crittografata viene inviata al server e se un utente malintenzionato è in grado di ascoltare e accedere al fatto che tutta la sicurezza in PHP non ha alcun valore. Trasmetti SEMPRE i dati in modo SICURO, questo viene fatto tramite SSL, ma sii stanco anche se SSL non è perfetto (il difetto di Heartbleed di OpenSSL ne è un esempio).

Inoltre, fai in modo che l'utente crei una password sicura, è semplice e dovrebbe sempre essere fatto, l'utente sarà grato per questo alla fine.

Infine, a prescindere dalle misure di sicurezza adottate, nulla è sicuro al 100%, più avanzata è la tecnologia da proteggere, più gli attacchi diventeranno avanzati. Ma seguire questi passaggi renderà il tuo sito più sicuro e molto meno desiderabile da attaccare.

Ecco una classe PHP che crea un hash e sale per una password facilmente

http://git.io/mSJqpw




I usually use SHA1 and salt with the user ID (or some other user-specific piece of information), and sometimes I additionally use a constant salt (so I have 2 parts to the salt).

SHA1 is now also considered somewhat compromised, but to a far lesser degree than MD5. By using a salt (any salt), you're preventing the use of a generic rainbow table to attack your hashes (some people have even had success using Google as a sort of rainbow table by searching for the hash). An attacker could conceivably generate a rainbow table using your salt, so that's why you should include a user-specific salt. That way, they will have to generate a rainbow table for each and every record in your system, not just one for your entire system! With that type of salting, even MD5 is decently secure.




Anche se la domanda è stata risolta, voglio solo ribadire che i sali usati per l'hashing dovrebbero essere casuali e non come l'indirizzo di posta elettronica come suggerito nella prima risposta.

Ulteriori spiegazioni sono disponibili http://www.pivotalsecurity.com/blog/password-hashing-salt-should-it-be-random/

Recentemente ho avuto una discussione se gli hash delle password salati con bit casuali sono più sicuri di quelli salati con sali ipotetici o conosciuti. Vediamo: Se il sistema che memorizza la password è compromesso e il sistema che memorizza il sale casuale, l'attaccante avrà accesso all'hash e al sale, quindi se il sale è casuale o meno, non importa. L'attaccante può generare tavoli arcobaleno pre-calcolati per rompere l'hash. Ecco la parte interessante: non è così banale generare tabelle pre-calcolate. Prendiamo un esempio del modello di sicurezza WPA. La password WPA non viene mai inviata al punto di accesso wireless. Invece, è sottoposto a hash con il tuo SSID (il nome della rete, come Linksys, Dlink, ecc.). Una buona spiegazione di come funziona è qui. Per recuperare la password dall'hash, è necessario conoscere la password e anche salt (nome della rete). Church of Wifi ha già tabelle di hash pre-calcolate con top 1000 SSID e circa 1 milione di password. La dimensione è di tutte le tabelle è di circa 40 GB. Come puoi leggere sul loro sito, qualcuno ha usato 15 array FGPA per 3 giorni per generare queste tabelle. Supponendo che la vittima stia usando il SSID come "a387csf3" e la password come "123456", sarà incrinata da quei tavoli? No! .. non può. Anche se la password è debole, le tabelle non hanno hash per SSID a387csf3. Questa è la bellezza di avere sale casuale. Distaccerà i cracker che prosperano su tavoli precompilati. Può fermare un hacker determinato? Probabilmente no. Ma l'uso di sali casuali fornisce ulteriore livello di difesa. Mentre siamo su questo argomento, discutiamo il vantaggio aggiuntivo di immagazzinare sali casuali su un sistema separato. Scenario n. 1: Gli hash delle password sono memorizzati sul sistema X e i valori saltati per l'hashing sono memorizzati sul sistema Y. Questi valori salt sono ipotizzabili o noti (ad es. Nome utente) Scenario n. 2: Gli hash delle password sono memorizzati sul sistema X e i valori di sale usati per l'hashing è memorizzato sul sistema Y. Questi valori di sale sono casuali. Nel caso in cui il sistema X sia stato compromesso, come puoi immaginare, c'è un enorme vantaggio nell'usare il sale casuale su un sistema separato (scenario n. 2). L'attaccante dovrà indovinare i valori di addizione per poter eseguire il crack degli hash. Se si utilizza un sale a 32 bit, sarà possibile richiedere 2 ^ 32 = 4.294.967.296 (circa 4.2 miliardi) di iterazioni per ogni password indovinata.




Voglio solo sottolineare che PHP 5.5 include un'API di hashing della password che fornisce un wrapper attorno a crypt() . Questa API semplifica notevolmente l'attività di hashing, verifica e rehashing degli hash delle password. L'autore ha anche rilasciato un pacchetto di compatibilità (sotto forma di un singolo file password.php che è require semplicemente utilizzare), per coloro che usano PHP 5.3.7 e versioni successive e vogliono usarlo subito.

Supporta BCRYPT solo per ora, ma mira ad essere facilmente esteso per includere altre tecniche di hashing della password e poiché la tecnica e il costo sono archiviati come parte dell'hash, le modifiche alla tecnica di hashing / costo non annulleranno gli hash correnti, il framework sarà automagicamente, utilizzare la tecnica / costo corretto durante la convalida. Gestisce anche la generazione di un sale "sicuro" se non si definisce esplicitamente il proprio.

L'API espone quattro funzioni:

  • password_get_info() - restituisce informazioni sull'hash specificato
  • password_hash() - crea un hash della password
  • password_needs_rehash() - controlla se l'hash dato corrisponde alle opzioni date. Utile per verificare se l'hash è conforme al tuo schema di tecnica / costo attuale che ti consente di eseguire nuovamente il cambio se necessario
  • password_verify() - verifica che una password corrisponda a un hash

Al momento queste funzioni accettano le costanti password PASSWORD_BCRYPT e PASSWORD_DEFAULT, che al momento sono sinonimi, con la differenza che PASSWORD_DEFAULT "potrebbe cambiare nelle versioni di PHP più recenti quando sono supportati algoritmi di hashing più recenti e più potenti." L'uso di PASSWORD_DEFAULT e password_needs_rehash () all'accesso (e il rehashing se necessario) dovrebbe garantire che gli hash siano ragionevolmente resilienti agli attacchi a forza bruta con poco o nessun lavoro per te.

EDIT: Ho appena realizzato che questo è menzionato brevemente nella risposta di Robert K. Lascerò questa risposta qui poiché penso che fornisca un po 'più di informazioni su come funziona e sulla facilità d'uso che fornisce a coloro che non conoscono la sicurezza.




Alla fine, il doppio hashing, matematicamente, non fornisce alcun vantaggio. In pratica, tuttavia, è utile per prevenire attacchi basati su tabelle arcobaleno. In altre parole, non è più vantaggioso dell'hash con un salt, che richiede molto meno tempo del processore nell'applicazione o sul server.




Related