"Dichiarazione ufficiale" su php.net: CRYPT_BLOWFISH è l'algoritmo hash più potente. Perché?

11

Primo: ho fatto questa domanda su StackOverflow e sono stato gentilmente invitato a postare di nuovo questo qui. Leggi la domanda originale qui .

Secondo le [prime] pagine del documento della nuova API di hashing / crittografia della password PHP 5.5 l'algoritmo usato CRYPT_BLOWFISH è "l'algoritmo più strong attualmente supportato da PHP" (si prega di fare una ricerca a testo completo per trovare la citazione sulla pagina ).

La mia domanda è: può essere dimostrato con alcuni numeri, parametri di riferimento, ecc.?

Secondo la pagina di crypt() di PHP doc CRYPT_BLOWFISH usa 22 salmerini e genera un hash di 60 caratteri, e CRYPT_SHA512 usa un salino di 16 caratteri e genera un hash di 118 caratteri. Entrambi gli algoritmi hanno fattori di costo variabili, quindi a prima vista, SHA512 sembra più strong (perché più lungo).

    
posta Sliq 25.05.2013 - 21:14
fonte

2 risposte

12
  • stiamo parlando del più strong per l'hashing delle password qui. Un buon hash generico non ha bisogno di essere un buon hash della password, e viceversa.
  • La lunghezza dell'hash è irrilevante quando supera una certa soglia. Un attacco pre-immagine su un hash n bit costa 2 n . Per un hash a 128 bit questo è completamente irrealizzabile.
  • bcrypt utilizzando una notazione esponenziale per costo e sha512-crypt utilizzando una notazione lineare è irrilevante. Confrontare il costo della CPU con i parametri predefiniti è anch'esso privo di significato.

    In pratica scegli un budget orario, diciamo 10ms. Quindi aggiusti il fattore di costo dell'hash in modo che corrisponda al budget. Quindi, se un utente malintenzionato utilizzava lo stesso hardware del difensore, tutti gli hash delle password decenti sarebbero uguali.

  • Un utente malintenzionato utilizza hardware diverso dal difensore. Il difensore usa una CPU standard. L'attaccante usa almeno una GPU, o se è un attaccante avanzato forse un FPGA o ASIC.

    La differenza tra diversi hash è la capacità di funzionare su diversi tipi di hardware. BCrypt ha bisogno di alcuni kilobyte di memoria veramente veloce. Funziona bene con le CPU comuni, ma non funziona bene con le GPU. Quindi bcrypt è molto ostile alla GPU. Con FPGA il vantaggio di bcrypt è minore, specialmente se ha una RAM integrata. Ma è ancora un po 'meglio.

  • Un semplice punto di riferimento per ottimizzare gli hash candidati allo stesso costo. Quindi eseguire un cracker basato su GPU, come hashcat o john-the-ripper e controllarne le prestazioni. Prevedo che bcrypt abbia un hashrate molto più basso.
  • C'è anche un altro interessante schema di password chiamato scrypt. Utilizza una maggiore quantità di memoria e se il tuo budget di tempo è elevato è significativamente migliore di bcrypt o SHA512-crypt.
risposta data 26.05.2013 - 00:20
fonte
1

La "prova matematica" è che puoi scegliere N arbitrariamente:

t(bcrypt) * (2^N) >> t(sha)

L'hash finale consiste nell'evitare le collisioni, quindi sei al sicuro fino a quando

hash >> password

Il sale serve a evitare le tavole arcobaleno, quindi sei al sicuro finchè

(rainbow table size) * (salt) >> (attacker storage space)
    
risposta data 20.12.2014 - 11:09
fonte

Leggi altre domande sui tag