Domanda:
Hashing delle password: aggiungi sale + pepe o è abbastanza sale?
Jacco
2011-04-22 14:53:02 UTC
view on stackexchange narkive permalink

Nota. Sono consapevole del fatto che il metodo corretto per l'hashing dell'archiviazione sicura delle password è scrypt o bcrypt. Questa domanda non è per l'implementazione nel software reale, è per la mia comprensione.

Correlati


Background
Per quanto ne so, il metodo consigliato / approvato per l'archiviazione dei verificatori delle password è da memorizzare:

  $ verificatore = $ salt + hash ($ salt + $ password)  

Dove:

  • hash () è un algoritmo di hashing crittografico
  • $ salt è un valore di entropia elevato, uniformemente distribuito e casuale
  • $ password è la password inserita dall'utente

Alcune persone consigliano di aggiungere una chiave segreta nel mix (a volte chiamata pepper ). Dove il pepe è una costante segreta, ad alta entropia, specifica del sistema.

La logica sembra essere che anche se l'aggressore si impossessa dei verificatori della password, ci sono buone probabilità che lui o lei non lo sappia il valore del pepe. Quindi montare un attacco di successo diventa più difficile.

Quindi, la mia domanda è:
L'aggiunta di un valore pepper oltre a un salt quando si esegue l'hashing delle password aumenta la sicurezza generale?

Oppure la maggiore sicurezza percepita è basata su false supposizioni?

Aggiornamento rapido
Conosco lo scopo del $ salt (ho scritto una risposta abbastanza lunga su StackOverflow a riguardo) la chiave aggiuntiva $ pepper non sta migliorando ciò che fa il sale. La domanda è: $ pepper aggiunge una sicurezza diversa da quella che fa il sale?

Salate un hashish per evitare che vengano spaccati da un tavolo arcobaleno. E poi i tre non hanno davvero bisogno di aggiungere un'ulteriore costante al mix.
Correlato ma non esattamente uguale a http://security.stackexchange.com/questions/211/password-hashing
Come ha detto @WzeberaFFS, non c'è alcun ulteriore vigore crittografico derivante dalla "pubblicazione" del tuo sale in questo modo. Penso che ti stia chiedendo perché gli hash in / etc / passwd hanno un formato di $ 1 $ saltsalt $ realhashhereblahblah, è giusto? Se sì, è così che il verificatore può prendere la password, aggiungervi il sale visibile, quindi hash. Senza il sale visibile non potresti mai ricreare l'hashish.
@Marcin, No, sto chiedendo esattamente cosa c'è scritto nella domanda. Non mi interessa lo scopo del sale. Sto cercando il possibile aumento della sicurezza aggiungendo una chiave segreta all'hash.
Allora la risposta è semplice: niente migliora con il sale "extra". Rendere più lungo il sale corretto lo renderebbe migliore, nel caso in cui le persone inizino a pre-calcolare le tabelle hash per piccoli sali.
Se ho capito bene, e questo è stato discusso nella q a cui mi sono collegato, un peperoncino può "... aiutare a mitigare alcuni scenari di compromissione (ad esempio, la scomparsa dei backup di database) conservando un pezzo del puzzle altrove" (@RoryMccune). Può anche differenziare i tuoi hash da qualcun altro - SE mai viene costruito un tavolo arcobaleno abbastanza grande ...
Questa domanda chiede specificamente del pepe. Per un quadro più ampio, vedere una discussione più completa altrove su IT Security StackExchange dell'argomento più generale di [hashing password] (http://security.stackexchange.com/questions/211/how-to-securely-hash-passwords)
molti argomenti contro l'uso di un peperone: https://stackoverflow.com/a/16896216/4031815
@commonSenseCode, sì, molti argomenti possono essere portati contro l'uso di un peperone.Ma avere molti argomenti non fa automaticamente un punto migliore.Nel caso del peperone, è ormai ampiamente accettato come metodo che aumenta la sicurezza, se utilizzato nel giusto contesto.Dal 2017 anche il NIST ha iniziato a consigliarlo.
[Dropbox blogged] (https://blogs.dropbox.com/tech/2016/09/how-dropbox-securely-stores-your-passwords/) che aggiungono un peperone.[Filippo Valsorda ha già scritto nel blog nel 2014] (https://blog.filippo.io/salt-and-pepper/) che pensa che un peperone sia una buona idea - è un noto addetto allateam di crittografia di Google.Se non lo prendi da quasi duecento voti positivi, prendilo da loro.
Qual è lo scopo della salatura fuori dall'hash?
Usiamo un pepe diverso per ambiente (e "conservato in modo sicuro").Ciò garantisce inoltre che gli hash non possano essere "trasferiti" tra gli ambienti, analogamente alla crittografia con una chiave specifica dell'ambiente.(C'è anche un pepe applicato alla crittografia basata su chiavi, con lo stesso intento: è necessario un ulteriore pezzo del puzzle che rende molto più difficile abilitare il "trasferimento" di dati tra ambienti.)
Sette risposte:
Jesper M
2011-04-23 13:36:23 UTC
view on stackexchange narkive permalink

In alcune circostanze, i peperoni possono essere utili.

Come esempio tipico, supponiamo che tu stia creando un'applicazione web. Consiste di codice webapp (in esecuzione in alcuni framework webapp, ASP.NET MVC, Pyramid on Python, non importa) e un database SQL per l'archiviazione. La webapp e il database SQL vengono eseguiti su server fisici diversi .

L'attacco più comune contro il database è un attacco SQL Injection riuscito. Questo tipo di attacco non ottiene necessariamente l'accesso al codice della tua webapp, perché la webapp viene eseguita su un altro server ID utente &.

Devi memorizzare le password in modo sicuro nel database e trova qualcosa sotto forma di:

  $ hashed_password = hash ($ salt. $ password)  

dove $ salt è memorizzato come testo normale nel database, insieme alla rappresentazione $ hashed_password e scelto a caso per ogni password nuova o modificata .

Il l'aspetto più importante di ogni schema di hashing delle password è che hash è una funzione hash crittograficamente sicura lenta , vedi https: //security.stackexchange .com / a / 31846/10727 per una maggiore conoscenza di base.

La domanda è quindi, dato che è quasi nullo aggiungere un valore costante al codice dell'applicazione e che il codice dell'applicazione non sarà in genere compromesso dur durante un attacco SQL Injection, quanto segue è quindi sostanzialmente migliore di quanto sopra?

  $ hashed_password = hash ($ pepper. $ sale. $ password)  

dove $ salt è memorizzato in testo normale nel database e $ pepper è una costante memorizzata in testo normale nel codice dell'applicazione (o configurazione se il codice viene utilizzato su più server o l'origine è pubblica).

Aggiungere questo $ pepper è facile: stai solo creando una costante nel tuo codice, inserendo un grande valore casuale crittograficamente sicuro (ad esempio 32 byte da / dev / urandom hex o base64 codificato) in esso e utilizzando quella costante nella funzione di hashing della password. Se hai utenti esistenti, hai bisogno di una strategia di migrazione, ad esempio modifica la password all'accesso successivo e memorizza un numero di versione della strategia di hashing della password insieme all'hash.

Risposta:

L'uso di $ pepper non aggiunge alla forza dell'hash della password se la compromissione del database non implica la compromissione dell'applicazione. Senza la conoscenza del pepe le password rimangono completamente sicure. A causa del salt specifico per la password non puoi nemmeno scoprire se due password nel database sono uguali o meno.

Il motivo è che hash ($ pepper. $ Salt. $ Password) crea efficacemente una funzione pseudo casuale con $ pepper come chiave e $ salt. $ password come input (per candidati hash sani come PBKDF2 con SHA *, bcrypt o scrypt). Due delle garanzie di una funzione pseudo casuale sono che non è possibile dedurre l'input dall'output sotto una chiave segreta e nemmeno l'output dall'input senza la conoscenza della chiave. Questo suona molto come la proprietà unidirezionale delle funzioni hash, ma la differenza sta nel fatto che con valori di entropia bassi come le password puoi enumerare efficacemente tutti i valori possibili e calcolare le immagini sotto la funzione hash pubblica e quindi trovare il valore il cui l'immagine corrisponde alla pre-immagine. Con una funzione pseudo casuale non puoi farlo senza la chiave (cioè senza il pepe) in quanto non puoi nemmeno calcolare l'immagine di un singolo valore senza la chiave.

L'importante ruolo di $ salt in questa impostazione entra in gioco se hai accesso al database per un periodo di tempo prolungato e puoi ancora lavorare normalmente con l'applicazione dall'esterno. Senza $ salt potresti impostare la password di un account che controlli su un valore noto $ passwordKnown e confrontare l'hash con la password di una password sconosciuta $ passwordSecret . Come hash ($ pepper. $ PasswordKnown) == hash ($ pepper. $ PasswordSecret) se e solo se $ passwordKnown == $ passwordSecret puoi confrontare una password sconosciuta con qualsiasi valore scelto (come tecnicismo presumo la resistenza alle collisioni della funzione hash). Ma con il salt si ottiene hash ($ pepper. $ Salt1. $ PasswordKnown) == hash ($ pepper. $ Salt2. $ PasswordSecret) se e solo se $ salt1. $ passwordKnown == $ salt2. $ passwordSecret e come $ salt1 e $ salt2 sono stati scelti casualmente per $ passwordKnown e rispettivamente $ passwordSecret i sali non saranno mai gli stessi (assumendo valori casuali abbastanza grandi come 256 bit) e non potrai più confrontare le password tra loro.

Hmm, la modifica ha rimosso gran parte dell'incertezza presente nella risposta scritta da @Jesper Mortensen. Forse la modifica dovrebbe essere annullata e spostata in una risposta separata?
Il succo dell'argomento qui è abbastanza buono e tendo ad essere d'accordo. Tuttavia, non inserire una costante nel codice se puoi evitarlo, rendilo una variabile di configurazione di qualche tipo (ovviamente non memorizzato nel DB, ma nemmeno nel codice).
@Jacco: Sono d'accordo che il tono di questa risposta è cambiato con le modifiche fatte. Ma poi, guardando chi ha apportato le modifiche, ora sono più a mio agio che questa risposta sia corretta (nell'ambito del suo ambito), quindi sono felice di lasciarla così com'è ora. :-)
Sono d'accordo con l'affermazione: ** che è quasi zero sforzo aggiungere un valore costante **. Lo è davvero, quindi anche se non così critico come il salting di una password, non vedo alcun motivo per escludere il peppering in qualche forma per fornire una protezione a livello di codice dell'applicazione.
@frankodwyer, ** Potresti anche avere entrambi. ** Costante nel codice sul server web più un'altra costante in un'entità "config" su un altro server.
E se avessi salvato un byte [] per un altro RNG e poi, oltre al salt, aggiungessi un altro blocco di dati da quello?Funzionerebbe anche come "peperone che cambia"?
@frankodwyer quale sarebbe il vantaggio in termini di sicurezza di posizionare il pepe nella configurazione?La configurazione viene in genere archiviata nello stesso repository di controllo del codice sorgente, distribuita come testo normale insieme ai file binari e caricata in memoria.Suppongo che se volessi cambiare la configurazione di pepper sia più facile, ma dovresti comunque preoccuparti di un percorso di migrazione e in realtà è un problema di ingegneria, non di sicurezza.
Detto questo, esiste un concetto di "configurazione sicura", come Azure Key Vault (che utilizza HSM).Potresti mettere il tuo segreto lì e ottenerlo in modo sicuro in fase di esecuzione, possibilmente conservandolo anche come `SecureString` in memoria.Ciò creerebbe sicuramente un serio ostacolo per l'aspirante aggressore.
Per quanto riguarda il confronto degli hash `passwordKnown`, dubito che sia un approccio fattibile visto come la velocità con cui potresti cambiare le password nell'app web (presumibilmente usando l'interfaccia utente, anche se in qualche modo lo script per utilizzare l'HTTP / API sottostante)probabilmente sarebbe troppo lento per montare effettivamente qualsiasi attacco.
c'è qualche vantaggio nell'archiviare il sale nel database?I sistemi Drupal, ad esempio, memorizzano solo il sale nel filesystem.
@CapiEtheriel Fintanto che generi un nuovo salt ogni volta che una nuova password viene hash e la memorizzi nel filesystem il risultato netto è lo stesso (con l'eccezione della soluzione del filesystem che è ingombrante).Ma sembra interpretare male l'obiettivo del sale: rallentare il cracking delle password facendo in modo che ogni password debba essere elaborata separatamente.La stessa password per due utenti diversi sarà diversa e qualunque hash trovi in un utente non avrà importanza per un altro a causa della differenza di salt, quindi il sale può essere "pubblico" senza rischi per la sicurezza.
Thomas Pornin
2011-04-22 19:53:35 UTC
view on stackexchange narkive permalink

(Nota: usare un salt è solo metà del lavoro; devi anche rallentare la funzione hash, in modo che attaccare una singola password a bassa entropia sia ancora difficile. La lentezza si ottiene solitamente attraverso più iterazioni o hashing la concatenazione di 10000 copie di salt e password.)

Quello che fa il tuo "pepe" è che trasforma l'hash in un MAC. Creare un MAC buono e sicuro da una funzione hash non è facile, quindi è meglio usare HMAC invece di un costrutto fatto in casa (il modo teorico di definirlo è che una funzione hash resistente alle collisioni è non necessariamente indistinguibile da un oracolo casuale).

Con un MAC, potresti guadagnare un po 'di sicurezza nel seguente senso: forse, l'accesso in lettura al database da parte dell'attaccante potrebbe cessare di essere un vero problema. La chiave MAC (il "pepe") può concentrare la necessità di riservatezza. Tuttavia, ciò si basa sul fatto che il MAC è anche una funzione unidirezionale, che è una proprietà che otterrai da molte costruzioni MAC (incluso HMAC) ma che non è realmente garantita crittograficamente parlando (ci sono sottigliezze).

Il "pepe" implica che hai una chiave da gestire, inclusa l'archiviazione sicura in un modo che resista ai riavvii. Una chiave è piccola e si adatta alla RAM, ma, a causa dei requisiti di archiviazione, non è chiaro se migliori la sicurezza. Un utente malintenzionato in grado di leggere l'intero database di solito può anche leggere l'intero disco rigido, incluso qualsiasi file "protetto". Le dimensioni ridotte della chiave possono consentire alcune impostazioni avanzate, ad es. la chiave viene memorizzata su smartcard che vengono utilizzate all'avvio ma non lasciate collegate in seguito. Per riassumere, se valga la pena pepare lo sforzo dipende completamente dal contesto: in generale, lo sconsiglierei per evitare la complessità aggiuntiva.

Sto cercando di capire come "Aggiungendo una chiave l'hash si trasforma in un MAC". Ho ragione nel capire che, aggiungendo un valore costante (insieme alla password e al sale) nell'algoritmo di hashing, l'uso modificato della primitiva influisce sulla forza del risultato? E che, se la chiave è nota, è probabile che lo schema generale sia meno sicuro?
@Jacco: se la funzione hash è buona, allora no, non la indebolisci in alcun modo aggiungendo un prefisso o suffisso noto. Tuttavia, essere una buona funzione hash non è del tutto equivalente ad essere un buon MAC (la differenza è sottile ma reale), da qui la necessità di seguire costruzioni ben studiate come HMAC. Per quanto riguarda un buon libro, puoi provare l'Handbook of Applied Cryptography (http://www.cacr.math.uwaterloo.ca/hac/) (non lo stesso libro di "Applied Cryptography" di Schneier).
@Thomas Pornin: Si prega di vedere la mia risposta di seguito - Non sono sicuro che stiamo parlando della stessa cosa. Se lo siamo, sto usando parole più comuni agli sviluppatori di webapp di seguito, quindi il tuo commento su ciò che sto descrivendo sarebbe prezioso.
@Jesper: stiamo parlando della stessa cosa, ma con punti di vista distinti. Il "pepe" aumenta la sicurezza solo nella misura in cui non è noto all'attaccante - se questo è vero o no non è facile da indovinare, specialmente nella tua configurazione in cui la webapp e il database si trovano su macchine distinte. Il pepe non _diminuisce_ la sicurezza da solo, tranne per il fatto che aumenta la complessità dell'installazione (un valore che non deve essere conosciuto dall'aggressore è una chiave, e la gestione delle chiavi è nota per essere non immediata). Inoltre, con un pepe segreto, l'aumento della sicurezza dipende dal fatto che il costrutto sia un buon MAC.
"_Il" pepe "implica che tu abbia una chiave da gestire, inclusa l'archiviazione sicura in un modo che resista al riavvio ._" E se puoi farlo, perché non crittografare il database delle password?
@curiousguy: bene, puoi. Alcuni potrebbero vedere l'hashing come un livello di sicurezza aggiuntivo: anche se l'attaccante ottiene il "pepe", non può comunque recuperare le password immediatamente (può eseguire un attacco con dizionario offline, ma non è così facile come avere un elenco di password decrittografate ).
-1 per il commento "Un utente malintenzionato che può leggere l'intero database di solito può anche leggere l'intero disco rigido". Chiaramente non sei un penetration tester, non fare queste supposizioni.
Bene che Rook abbia sottolineato il difetto nel commento di Thomas (grazie @Rook); tuttavia, ho votato contro la risposta perché l'idea generale ha un senso, e questo è ciò che conta: sono d'accordo che la complessità è il nemico della sicurezza.
@Lex, ** La complessità non necessaria ** è il nemico della sicurezza. La sicurezza stessa è intrinsecamente complessa.
@rook, è meglio sottolineare il difetto nella risposta piuttosto che attaccare le credenziali di chi scrive, poiché evidenziare il difetto aumenta le informazioni con cui gli altri utenti possono giudicare la risposta. Lo farò qui. Non è vero che le credenziali del database sono solitamente uguali all'accesso dell'intero sistema operativo. I server database sono spesso separati dall'applicazione che li esegue, che si connette sulla rete. Oppure i difetti nel software del database potrebbero portare al pieno accesso al database, anche se l'utente del database non può uscire dalla sua sandbox.
"hai una chiave da gestire" che può essere solo una riga di codice nella mia app (ad es. "const key =" 76fc67a8-dde0-4f49-9e5e-84fb186b97b9 "") quindi non vedo perché no.Come altri hanno già detto, avere accesso in lettura al mio DB potrebbe essere abbastanza lontano dall'accesso ai miei file binari / sorgenti.
Si potrebbe anche aggiungere la chiave al proprio deposito segreto basato su HSM (da cui deve comunque gestire e recuperare i segreti) come Azure Key Vault.Quindi, anche se l'aggressore recupera il codice e i file binari, non ottiene il segreto.Si potrebbe anche fare un ulteriore passo avanti e memorizzare la chiave in modo sicuro in memoria (ad esempio, "SecureString" di .NET), nel qual caso anche l'accesso alla memoria del server potrebbe non portare facilmente alla perdita della chiave.La complessità aggiunta sarebbe piuttosto bassa.
martinstoeckli
2012-11-02 20:52:40 UTC
view on stackexchange narkive permalink

Vorrei sottolineare cosa può fare veramente un peperone.

Quando aiuta un peperone?

Come gli altri hanno già sottolineato, l'aggiunta di un peperone è solo un vantaggio , fintanto che l'aggressore ha accesso ai valori hash nel database, ma non ha alcun controllo sul server e quindi non conosce il pepe . Questo è tipico dell'iniezione SQL, probabilmente uno degli attacchi più usati, perché è così facile da fare.

Cosa migliora un pepper?

  $ hashValue = bcrypt ('12345', $ cost, $ salt);  

Questa password la puoi ottenere facilmente con un attacco al dizionario, anche se hai usato correttamente una funzione di derivazione della chiave lenta. Metti le password più utilizzate in un dizionario e forza bruta con queste password deboli. È molto probabile che troviamo la password in (troppi) casi.

  $ hashValue = bcrypt ('12345anm8e3M-83 * 2cQ1mlZaU', $ cost, $ salt);  

Con il pepe, la password debole cresce in lunghezza, ora contiene caratteri speciali e, cosa più importante, la troverai in nessun dizionario. Quindi, finché il pepe rimane segreto, previene gli attacchi ai dizionari , in questo caso può proteggere le password deboli.

Modifica:

un modo migliore per aggiungere una chiave lato server, piuttosto che usarlo come pepe. Con un peperoncino un utente malintenzionato deve ottenere ulteriori privilegi sul server per ottenere la chiave. Lo stesso vantaggio si ottiene calcolando prima l'hash e successivamente crittografando l'hash con la chiave lato server (crittografia a due vie). Questo ci dà la possibilità di scambiare la chiave ogni volta che è necessario.

  $ hash = bcrypt ($ passwort, $ salt); $ encryptedHash = encrypt ($ hash, $ serverSideKey);  codice> 
Suggerirei bcrypt (hash_mac ('sha256', $ password, $ pepper), $ salt)
@Jacco - Ho appena aggiunto un esempio di utilizzo di un hmac.
Non sono sicuro in quale lingua sia il tuo esempio, ma sarebbe più chiaro se fosse indipendente dalla lingua
@Jacco - È PHP, ma la funzione `bcrypt` è fittizia, perché PHP stesso non fornisce ancora tale funzione (prima della 5.5), la funzione` hash_hmac` esiste però. Ho provato a modificare la risposta, quindi tutte le parti confuse vengono rimosse, cosa pensi che potrei migliorare di più?
nealmcb
2011-05-10 10:21:24 UTC
view on stackexchange narkive permalink

Il documento sull'invenzione del salting e delle iterazioni, per le password Unix ( Password Security: A Case History, Morris & Thompson, 1978), descriveva anche l'equivalente di un peperone:

I primi otto caratteri della password dell'utente sono usati come chiave per il DES; quindi l'algoritmo viene utilizzato per crittografare una costante. Sebbene questa costante al momento sia zero, è facilmente accessibile e può essere resa dipendente dall'installazione.

Non ne ho mai sentito parlare. Qualcun altro?

Penso che tutte le distribuzioni moderne utilizzino qualcosa basato su una funzione hash (non una funzione di crittografia come DES), quindi questa capacità non è più disponibile.
eckes
2017-05-06 23:08:35 UTC
view on stackexchange narkive permalink

Solo a proposito, le nuove linee guida sull'identità digitale del NIST (Draft) consigliano vivamente di utilizzare anche Pepper:

https://pages.nist.gov/800-63-3/ sp800-63b.html # sec5

5.1.1.2 Memorized Secrets Verifier:

... Una funzione hash con chiave (ad esempio, HMAC [FIPS198-1 ]), con la chiave memorizzata separatamente dagli autenticatori con hash (ad esempio, in un modulo di sicurezza hardware) DOVREBBE essere utilizzata per resistere ulteriormente agli attacchi del dizionario contro gli autenticatori con hash memorizzati.

Wow, ho sostenuto per anni il pepe, ma le persone lo implementano raramente senza una ragione apparente.Non sapevo che ora anche il NIST lo consiglia!Grazie per questa risposta, dovrebbe essere più in alto.
Alex R
2013-08-31 11:20:25 UTC
view on stackexchange narkive permalink

Considera questo scenario:

Sto per entrare in un sito web X usando un'iniezione SQL per recuperare un elenco di utenti, con le loro password hash e salt. Supponiamo che anche il sito Web X utilizzi un pepe globale.

Tutto ciò che dovrei fare sarebbe registrare un utente sul sito Web X con un nome utente e una password a me noti prima dell'iniezione SQL. Vorrei quindi conoscere, per un particolare record nel database, l'hash della password, la password in testo normale, il salt (memorizzato come testo normale) e sarebbe computazionalmente banale per me rompere il pepe globale sulla base di questo record .

Quindi, davvero, un peperone sarebbe un modo per rallentare un attaccante per una quantità insignificante di tempo di overhead. Non dovrebbero forzare brutemente la password + sale + pepe, come previsto, solo il pepe.

Quanto sopra è una forma di attacco di testo in chiaro scelto . Finché gli aggressori conoscono l'algoritmo (hash ()), l'output ($ hashed_password) e tutti gli input tranne uno ("costanti" $ salt & $ password e "variabile" $ pepe), possono "risolvere per x "come un'equazione di algebra lineare (h = s + p + x == hsp = x), ma naturalmente con la forza bruta. Rendere il pepper più lungo di 56 byte (448 bit), il limite di bcrypt, aumenta il costo del tempo ed è buono come bcrypt ma potrebbe non essere buono come scrypt. Quindi, finché il pepe è sufficientemente lungo, è un miglioramento.

E se il pepe fosse un valore casuale a 128 bit? È ancora banale decifrarlo sulla base del valore della password salt e del testo in chiaro? Il motivo per cui i valori di sale e pepe sono utili è perché puoi facilmente renderlo abbastanza lungo (128 bit) e non devi ricordarlo, ecco perché spezzarlo con la forza bruta non è mai banale.
Se il pepe è un valore casuale a 128 bit, non sarà certamente ancora banale da decifrare. Tuttavia devi ricordare quanto segue: - stai aggiungendo questo valore al sovraccarico della funzione di hashing su ** ogni singola convalida ** - il pepe è globale e deve essere crackato con la forza bruta solo una volta, non una per ogni record - è molto meglio aumentare la lunghezza del sale rispetto al pepe
Il costo di qualsiasi funzione hash anche parzialmente appropriata come bcrypt, script o anche iterazioni multiple di alcuni sha, non dipende dalla lunghezza della chiave, quindi è sbagliato. Se la funzione hash viene scelta correttamente, e non solo usando una singola iterazione di `sha256`, il pepper deve semplicemente aumentare la password iniziale a 50 bit di entropia per renderla a prova di proiettile per decenni se non secoli. Ovviamente, come ha detto @void_in, lo aumentiamo a 128 bit o 256 bit, solo perché possiamo.
Brian Sparks
2014-09-07 23:04:07 UTC
view on stackexchange narkive permalink

Non ho molta familiarità con il modo in cui un server sarebbe in grado di nascondere una costante di pepe globale, ma la mia opinione è che prima o poi un hacker che è penetrato nel server capirà come catturare il valore di pepe. sicuro richiederebbe hardware speciale. Un modo per farlo sarebbe utilizzare una scheda FPGA installata nel server. L'FPGA conterrebbe il codice utilizzato per eseguire l'hash compreso il valore del pepe e tutti i calcoli dell'hash avvengono all'interno dell'FPGA. Con l'FPGA, la programmazione può essere una funzione unidirezionale. Il peperone può essere programmato ma non ci sono istruzioni che possono essere inviate per leggerlo nuovamente. Il pepe sarebbe stato conservato su un pezzo di carta chiuso in una cassaforte. Se il pepe è 128 bit generati in modo casuale, non ci sarebbe alcun modo pratico per determinarlo.
Non sono sicuro di quanto sarebbe pratico in quanto aumenterebbe il costo dell'hardware del server.

Sono disponibili moduli crittografici che fanno qualcosa del genere: dispositivi unidirezionali per memorizzare + verificare password e / o chiavi.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...