Utilizzare sempre un algoritmo di hashing della password: Argon2 , scrypt , bcrypt o PBKDF2 .
Argon2 ha vinto la competizione di hashing delle password 2015. Scrypt , bcrypt e PBKDF2 sono algoritmi più vecchi che ora sono considerati meno preferiti, ma comunque fondamentalmente sani, quindi se la tua piattaforma non supporta ancora Argon2, per ora va bene usare un altro algoritmo.
Non archiviare mai una password direttamente in un database. Non crittografarlo, neanche: altrimenti, se il tuo sito viene violato, l'attaccante ottiene la chiave di decrittazione e quindi può ottenere tutte le password. Le password DEVONO essere hash .
Un hash password ha proprietà diverse da un hash tabella hash o un hash crittografico. Non utilizzare mai un normale hash crittografico come MD5, SHA-256 o SHA-512 su una password. Un algoritmo di hashing della password utilizza un salt , che è unico (non utilizzato per nessun altro utente o nel database di qualcun altro). Il sale è necessario affinché gli aggressori non possano semplicemente pre-calcolare gli hash delle password comuni: con un salt, devono riavviare il calcolo per ogni account. Un algoritmo di hashing della password è intrinsecamente lento - il più lento che puoi permetterti. La lentezza fa male all'attaccante molto più di te perché l'attaccante deve provare molte password diverse. Per ulteriori informazioni, vedere Come eseguire l'hashing sicuro delle password .
Un hash password codifica quattro informazioni:
- Un indicatore di quale algoritmo viene utilizzato. Ciò è necessario per l' agilità : le raccomandazioni crittografiche cambiano nel tempo. Devi essere in grado di passare a un nuovo algoritmo.
- Un indicatore di difficoltà o durezza. Più alto è questo valore, maggiore è il calcolo necessario per calcolare l'hash. Questo dovrebbe essere un valore di configurazione costante o globale nella funzione di modifica della password, ma dovrebbe aumentare nel tempo man mano che i computer diventano più veloci, quindi è necessario ricordare il valore per ciascun account. Alcuni algoritmi hanno un singolo valore numerico, altri hanno più parametri lì (ad esempio per ottimizzare l'utilizzo della CPU e l'utilizzo della RAM separatamente).
- Il sale. Poiché il sale deve essere univoco a livello globale, deve essere archiviato per ogni account. Il salt dovrebbe essere generato casualmente ad ogni cambio di password.
- L'hash corretto, ovvero l'output del calcolo matematico nell'algoritmo di hashing.
Molte librerie includono una coppia di funzioni che compatta convenientemente queste informazioni come una singola stringa: una che prende l'indicatore dell'algoritmo, l'indicatore di durezza e la password, genera un salt casuale e restituisce la stringa hash completa; e uno che accetta una password e l'intera stringa hash come input e restituisce un valore booleano che indica se la password era corretta. Non esiste uno standard universale, ma è una codifica comune
$ algoritmo $ parametri $ salt $ output
dove algorithm
è un numero o una stringa alfanumerica breve che codifica la scelta dell'algoritmo, parameters
è una stringa stampabile salt
e output
sono codificati in Base64 senza terminare =
.
16 byte sono sufficienti per il sale e l'output. (Vedi ad esempio i consigli per Argon2 .) Codificato in Base64, composto da 21 caratteri ciascuno. Le altre due parti dipendono dall'algoritmo e dai parametri, ma sono tipici 20–40 caratteri. Questo è un totale di circa 82 caratteri ASCII ( CHAR(82)
e non è necessario Unicode), a cui dovresti aggiungere un margine di sicurezza se pensi che sarà difficile allargare il campo in seguito.
Se si codifica l'hash in un formato binario, è possibile ridurlo a 1 byte per l'algoritmo, 1–4 byte per la durezza (se si codificano alcuni parametri) e 16 byte ciascuno per il sale e l'output , per un totale di 37 byte. Pronunciare 40 byte ( BINARY(40)
) per avere almeno un paio di byte di riserva. Si noti che si tratta di byte a 8 bit, non di caratteri stampabili, in particolare il campo può includere byte null.
Si noti che la lunghezza dell'hash non è completamente correlata alla lunghezza della password.