it-swarm.it

Quale tipo di dati utilizzare per il campo della password con hash e quale lunghezza?

Non sono sicuro di come funziona l'hashing delle password (lo implementeremo in seguito), ma ora è necessario creare lo schema del database.

Sto pensando di limitare le password a 4-20 caratteri, ma come capisco dopo aver crittografato la stringa hash avrà una lunghezza diversa.

Quindi, come conservare queste password nel database?

252
z-boss

Aggiornamento: semplicemente utilizzando una funzione di hash non è abbastanza forte per la memorizzazione delle password. Dovresti leggere la risposta di Gilles su questo thread per una spiegazione più dettagliata.

Per le password, utilizzare un algoritmo di hash per rafforzare le chiavi come Bcrypt o Argon2i. Ad esempio, in PHP, utilizzare la funzione password_hash () , che utilizza Bcrypt per impostazione predefinita.

$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

Il risultato è una stringa di 60 caratteri simile alla seguente (ma le cifre variano, perché genera un sale unico).

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

Utilizzare il tipo di dati SQL CHAR(60) per memorizzare questa codifica di un hash Bcrypt. Nota che questa funzione non codifica come una stringa di cifre esadecimali, quindi non possiamo facilmente disfarlo per memorizzare in binario.

Altre funzioni hash hanno ancora degli usi, ma non per memorizzare le password, quindi terrò la risposta originale qui sotto, scritta nel 2008.


Dipende dall'algoritmo di hashing che usi. L'hash produce sempre un risultato della stessa lunghezza, indipendentemente dall'input. È tipico rappresentare il risultato hash binario nel testo, come una serie di cifre esadecimali. Oppure puoi usare la funzione UNHEX() per ridurre di metà una stringa di cifre esadecimali.

  • MD5 genera un valore hash a 128 bit. Puoi usare CHAR (32) o BINARY (16)
  • SHA-1 genera un valore hash a 160 bit. Puoi usare CHAR (40) o BINARY (20)
  • SHA-224 genera un valore di hash a 224 bit. Puoi usare CHAR (56) o BINARY (28)
  • SHA-256 genera un valore hash a 256 bit. Puoi usare CHAR (64) o BINARY (32)
  • SHA-384 genera un valore di hash a 384 bit. Puoi usare CHAR (96) o BINARY (48)
  • SHA-512 genera un valore di hash a 512 bit. Puoi usare CHAR (128) o BINARY (64)
  • BCrypt genera un valore di hash a 448 bit dipendente dall'implementazione. Potresti aver bisogno di CHAR (56), CHAR (60), CHAR (76), BINARY (56) o BINARY (60)

A partire dal 2015, NIST consiglia di utilizzare SHA-256 o superiore per qualsiasi applicazione di funzioni hash che richiedono l'interoperabilità. Ma il NIST non raccomanda l'uso di queste semplici funzioni di hash per archiviare le password in modo sicuro.

Gli algoritmi di hashing minori hanno i loro usi (come interni a un'applicazione, non a interscambio), ma sono noti per essere crackabili .

437
Bill Karwin

Puoi effettivamente usare CHAR (lunghezza dell'hash) per definire il tuo tipo di dati per MySQL perché ogni algoritmo di hashing valuterà sempre lo stesso numero di caratteri. Ad esempio, SHA1 restituisce sempre un numero esadecimale di 40 caratteri.

13
Noah Goodrich

È possibile trovare questo articolo di Wikipedia su salting utile . L'idea è di aggiungere un set di dati per randomizzare il tuo valore hash; questo proteggerà le tue password dagli attacchi del dizionario se qualcuno ottiene accesso non autorizzato agli hash delle password.

8
Dana the Sane

Come stringa di lunghezza fissa (VARCHAR (n) o comunque MySQL lo chiama). Un hash ha sempre una lunghezza fissa di 12 caratteri (a seconda dell'algoritmo di hash che usi). Quindi una password di 20 caratteri verrebbe ridotta a un hash di 12 caratteri e una password di 4 caratteri restituirebbe anche un hash di 12 caratteri.

7
Treb

Usa sempre un algoritmo di hashing della password: Argon2 , scrypt , bcrypt o PBKDF2 .

Argon2 ha vinto la competizione hashing delle password 2015. Scrypt , bcrypt e PBKDF2 sono algoritmi più vecchi che sono considerati meno preferiti ora, ma fondamentalmente validi, quindi se la tua piattaforma non supporta ancora Argon2, per ora è ok usare un altro algoritmo.

Non memorizzare mai una password direttamente in un database. Non crittografarlo: altrimenti, se il tuo sito viene violato, l'utente malintenzionato riceve la chiave di decrittografia e così può ottenere tutte le password. Le password DEVONO essere hash .

Un hash della password ha proprietà diverse da un hash della tabella hash o da 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 è univoco (non utilizzato per nessun altro utente o nel database di qualcun altro). Il sale è necessario in modo che gli attaccanti non possano solo precalcolare gli hash delle password comuni: con un sale, devono riavviare il calcolo per ogni account. Un algoritmo di hashing della password è intrinsecamente lento - il più lento possibile. La lentezza ferisce l'attaccante molto più di te perché l'attaccante deve provare molte password diverse. Per ulteriori informazioni, vedere Come fare in modo sicuro le password hash .

Un hash della password codifica quattro informazioni:

  • Un indicatore di quale algoritmo viene utilizzato. Ciò è necessario per agilità : le raccomandazioni di crittografia cambiano nel tempo. Devi essere in grado di passare a un nuovo algoritmo.
  • Un indicatore di difficoltà o durezza. Più alto è questo valore, più 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 (ad esempio per regolare l'utilizzo della CPU e RAM utilizzo separatamente).
  • Il sale. Dal momento che il sale deve essere unico a livello mondiale, deve essere memorizzato per ogni account. Il sale dovrebbe essere generato casualmente su ogni cambio di password.
  • L'hash corretto, cioè l'output del calcolo matematico nell'algoritmo di hashing.

Molte librerie includono una coppia di funzioni che confeziona 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 l'intera stringa hash; e uno che accetta una password e la stringa hash completa come input e restituisce un valore booleano che indica se la password è corretta. Non esiste uno standard universale, ma una codifica comune è

$  Algoritmo  $  parametri  $  sale  $  uscita 

dove algorithm è un numero o una breve stringa alfanumerica che codifica la scelta dell'algoritmo, parameters è una stringa stampabile e salt e output sono codificati in Base64 senza terminare =.

16 byte sono sufficienti per il sale e l'output. (Vedi ad es. consigli per Argon2 .) Codificati in Base64, cioè 21 caratteri ciascuno. Le altre due parti dipendono dall'algoritmo e dai parametri, ma 20-40 caratteri sono tipici. Questo è un totale di circa 82 ASCII caratteri (CHAR(82), e non c'è bisogno di Unicode), a cui si dovrebbe aggiungere un margine di sicurezza se si pensa che stia per essere difficile allargare il campo più tardi.

Se si codifica l'hash in un formato binario, è possibile ottenerlo fino a 1 byte per l'algoritmo, 1-4 byte per la durezza (se si codificano alcuni parametri) e 16 byte per l'output e l'output , per un totale di 37 byte. Dire 40 byte (BINARY(40)) per avere almeno un paio di byte di riserva. Si noti che questi sono byte a 8 bit, non caratteri stampabili, in particolare il campo può includere byte nulli.

Si noti che la lunghezza dell'hash non è completamente correlata alla lunghezza della password.

4
Gilles

Dipende davvero dall'algoritmo di hashing che stai usando. La lunghezza della password ha poco a che fare con la lunghezza dell'hash, se non ricordo male. Cercare le specifiche sull'algoritmo di hashing che si sta utilizzando, eseguire alcuni test e troncare appena sopra.

3
willasaywhat

Gli hash sono una sequenza di bit (128 bit, 160 bit, 256 bit, ecc., A seconda dell'algoritmo). La colonna dovrebbe essere di tipo binario, non di testo/digitato a caratteri, se MySQL lo consente (il tipo di dati di SQL Server è binary(n) o varbinary(n)). Dovresti anche salare gli hash. I sali possono essere di testo o binari e avrete bisogno di una colonna corrispondente.

3
yfeldblum

Dovresti usare TEXT (memorizzare un numero illimitato di caratteri) per motivi di compatibilità diretta. Gli algoritmi di hash (necessità di) diventano più forti nel tempo e quindi questo campo di database dovrà supportare più caratteri nel tempo. Inoltre, a seconda della strategia di migrazione, potrebbe essere necessario memorizzare gli hash nuovi e vecchi nello stesso campo, pertanto non è consigliabile fissare la lunghezza a un tipo di hash.

3
bart

Ho sempre testato per trovare la lunghezza massima della stringa di una stringa crittografata e impostarla come lunghezza del carattere di un tipo VARCHAR. A seconda del numero di record che avrai, potrebbe davvero aiutare le dimensioni del database.

1
Stephen Walcher

per md5 vARCHAR (32) è appropriato. Per coloro che usano AES meglio usare varbinary.

0
Hare Srinivasa