it-swarm.dev

Cosa dovrebbe essere usato come sale?

Ho sempre sentito che è meglio usare i sali in cima alle password memorizzate, che poi vengono in qualche modo concatenate e hash in seguito. Ma non so cosa da usare come sale. Quale sarebbe un buon sale?

43
Sal

Supponiamo che tu abbia una tabella in cui archiviare la password per ogni persona.

Per "salvare" la password che viene generata, procedere come segue

  1. ottenere l'accesso dall'utente
  2. ottenere la password
  3. genera del sale da valori casuali. Diciamo, da/dev/random (come suggerito da @Michal), hai ottenuto "a12bc34de56fg"
  4. Utilizzare alcune funzioni di hashing per generare la password con hash. Supponiamo che la password originale fosse "1password" e utilizzerai qualsiasi SHA hashing. Lo farai

hashed_password = SHA (SHA (SHA (.... SHA ("1passworda12bc34de56fg"))))))))

Memorizza quella hashed_password, con login e salt, nella tabella.

login      password      salt
--------------------------------------
john       a7b82783...   a12bc34de56fg

E poi, per verificare quando un utente accede alla tua app:

  1. ottenere il login e la password
  2. recuperare il salt per quel login dal database (avrai il salt: a12bc34de56fg)
  3. concatena la password in chiaro con il sale e ripeti tutto l'hashing:

hashed_password = SHA (SHA (SHA (.... SHA ("1passworda12bc34de56fg"))))))))

Verificare se la password hashed calcolata è la stessa archiviata nel database. Saprai se la password era corretta o meno.

Questo è tutto!. Puoi ottenere il sale da qualsiasi fonte casuale ti piaccia. Perché dovrebbe essere casuale? Perché qualsiasi sale non casuale renderebbe molto più facile tentare di forzare la tua app.

13
woliveirajr

La classica raccomandazione per un salt per l'hash della password è:

  • A valore casuale di 128 bit o più ;
  • ottenuto da un generatore di numeri casuali crittograficamente valido ( /dev/random o /dev/urandom nei moderni Unix);
  • univoco per ciascuna voce (ovvero non riutilizzare lo stesso sale, generare un nuovo sale per ogni nuova password);
  • memorizzato in testo normale nel database (in modo che il salt sia disponibile durante la verifica dell'hash).

Ci sono molti discussioni passate su argomenti correlati . E, soprattutto, non dovresti non implementare il tuo schema di hashing della password - dovresti usare un'implementazione comprovata, ben testata, peer-reviewed bcrypt/PBKDF2) .

30
Jesper M

La risposta è "quasi tutto", anche se alcuni sono più forti di altri.

Supponiamo che tu stia utilizzando md5 (salt.password).

Senza sale, gli hacker creeranno rapidamente la maggior parte delle password semplicemente cercando l'hash in un tavolo Rainbow.

Supponiamo che tu usi "x" come sale per tutte le tue password. Molte delle tue password saranno ancora trovate, ma meno. Questo perché se la password è "p4ssw0rd", allora diventa "xp4ssw0rd" con il sale - rendendolo leggermente più difficile, ma non significativamente.

Ora supponiamo che tu utilizzi "% X88Fc + 7" come unico sale per tutte le password. A questo punto, i tavoli Rainbow non funzioneranno. Ma, in conseguenza dell'utilizzo di un unico parametro per tutte le password, l'hacker sarà in grado di generare una tabella Rainbow con tale presupposto e di creare tabelle Rainbow in anticipo. È molto più sicuro, ma non perfetto.

La prossima opzione più sicura è usare il nome utente come salt, in altre parole usando 'md5 (username.password)'. Ancora una volta, questo sconfigge la tabella Rainbow standard, ma un hacker potrebbe generare una tabella Rainbow per un nome utente specifico (come "root" o "amministratore"), in modo che ogni volta che viene cambiata la password, l'hacker può dare un'occhiata in un arcobaleno tabella invece di rompere nuovamente.

Quindi, per essere ancora più sicuro, scegli un sale casuale diverso per utenti diversi. Devi archiviarlo insieme all'hash nome utente e password. Questo sconfigge completamente i tavoli Rainbow.

Alcuni suggeriscono un generatore di numeri casuali "sicuro", piuttosto che qualcosa di semplice. Ad esempio, fare un MD5 (timestamp + nome utente) quando l'utente crea un account è semplice, ma non crittograficamente sicuro (poiché i timestamp e i nomi utente sono prevedibili e quindi bassa entropia). Ma dato che l'hacker ha comunque una copia di Salt quando ruba il database, non è un problema.

10

Per il sale basta usare un bit a caso.

Su Linux puoi usare /dev/random. È un generatore di numeri casuali del kernel basato sul rumore ambientale. È abbastanza imprevedibile tranne che per le macchine virtuali. Quindi se diciamo che il mouse fisico è collegato alla tua scatola, allora /dev/random Ti darà bit casuali di alta qualità buoni per il sale.

Ecco un buon articolo per cominciare. Vedi anche i riferimenti esterni.

Ecco un esempio Java . Guarda come il salt viene generato e memorizzato nel DB nella funzione createUser(). Ad eccezione dell'uso di import Sun.misc. ... È un ottimo codice.

1
Michał Šrajer