Domanda

Non sono sicuro di come funzioni l'hashing della password (lo implementerà in seguito), ma ora devo creare lo schema del database.

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

Quindi, come archiviare queste password nel database?

È stato utile?

Soluzione

Aggiornamento: il semplice utilizzo di una funzione hash non è abbastanza forte per l'archiviazione delle password. Dovresti leggere la risposta di Gilles su questa discussione per una spiegazione più dettagliata.

Per le password, utilizzare un algoritmo hash di rafforzamento delle chiavi come Bcrypt o Argon2i. Ad esempio, in PHP, usa 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 varieranno, perché genera un unico sale).

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

Usa 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 asimarla per archiviarla in binario.

Altre funzioni hash hanno ancora degli usi, ma non per l'archiviazione delle password, quindi terrò la risposta originale di seguito, 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 utilizzare UNHEX () per ridurre della 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 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 hash a 384 bit. Puoi usare CHAR (96) o BINARY (48)
  • SHA-512 genera un valore hash a 512 bit. Puoi usare CHAR (128) o BINARY (64)
  • BCrypt genera un valore hash a 448 bit dipendente dall'implementazione. Potrebbe essere necessario CHAR (56), CHAR (60), CHAR (76), BINARY (56) o BINARY (60)

A partire dal 2015, NIST consiglia di utilizzare SHA-256 o superiore per tutte le applicazioni di funzioni hash che richiedono interoperabilità. Ma NIST non consiglia di utilizzare queste semplici funzioni hash per archiviare le password in modo sicuro.

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

Altri suggerimenti

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.

Potresti trovare questo articolo di Wikipedia sulla salatura utile . L'idea è quella di aggiungere un set di dati per randomizzare il valore di hash; questo proteggerà le tue password dagli attacchi del dizionario se qualcuno ottiene l'accesso non autorizzato agli hash delle password.

Come una stringa di lunghezza fissa (VARCHAR (n) o comunque chiamata da MySQL). Un hash ha sempre una lunghezza fissa di, ad esempio, 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 produrrebbe anche un hash di 12 caratteri.

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

Argon2 ha vinto la competizione di hashing password 2015. Scrypt , bcrypt e PBKDF2 sono algoritmi più vecchi che sono considerato meno preferito ora, ma comunque fondamentalmente sano, quindi se la tua piattaforma non supporta ancora Argon2, per ora è ok 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 con 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 - & nbsp; 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 di hash .

Un hash password codifica quattro informazioni:

  • Un indicatore di quale algoritmo viene utilizzato. Ciò è necessario per agility : 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 di 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 è

$algorithm$parameters$salt$output

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

16 byte sono sufficienti per il sale e l'output. (Vedi ad esempio consigli su Argon2 .) Codificato in Base64, ovvero 21 personaggi 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 farlo scendere fino 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 output, per un totale di 37 byte. Pronuncia 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.

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

Dipende molto dall'algoritmo di hashing che stai utilizzando. La lunghezza della password ha poco a che fare con la lunghezza dell'hash, se ricordo bene. Cerca le specifiche dell'algoritmo di hashing che stai utilizzando, esegui alcuni test e troncali appena sopra.

Gli hash sono una sequenza di bit (128 bit, 160 bit, 256 bit, ecc., a seconda dell'algoritmo). La colonna deve essere di tipo binario, non di testo / carattere, 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 avrai bisogno di una colonna corrispondente.

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

Ho sempre provato a trovare la lunghezza della stringa MAX di una stringa crittografata e impostarla come lunghezza del carattere di un tipo VARCHAR. A seconda di quanti record hai, potrebbe davvero aiutare la dimensione del database.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top