Dovresti rendere pubblico l'algoritmo?
Cercare di nascondere i dettagli dell'implementazione (come l'algoritmo di hashing che usi) per preservare la sicurezza è la definizione stessa di sicurezza attraverso l'oscurità . Vi è ampio consenso sul fatto che l'oscurità non dovrebbe essere l'unica linea di difesa.
Se hai bisogno di mantenere segreto l'algoritmo hash, stai sbagliando e devi scegliere un algoritmo di hashing migliore. Quando usi un buon algoritmo, non c'è motivo di non dirlo al mondo perché non saranno in grado di rompere gli hash in ogni caso.
Nota anche che nel tuo caso il sale ti darà via. Se qualcuno si impossessa del tuo database, sarà in grado di leggere quale algoritmo è stato usato da quello. Quindi l'oscurità non fa forzare brutalmente più strong qui. La pubblicità di uno schema debole, tuttavia, potrebbe incoraggiare gli aggressori. Un strong potrebbe avere l'effetto opposto. Il punto che Mike Goodwin fa in la sua risposta dovrebbe anche essere preso in considerazione.
Crypt () è sicuro?
La domanda pertinente da porsi è quindi se crypt()
è abbastanza sicuro. Diamo un'occhiata al manuale PHP :
password_hash()
uses a strong hash, generates a strong salt, and applies proper rounds automatically. password_hash()
is a simple crypt()
wrapper and compatible with existing password hashes. Use of password_hash()
is encouraged.
Some operating systems support more than one type of hash. In fact, sometimes the standard DES-based algorithm is replaced by an MD5-based algorithm.
The standard DES-based crypt()
returns the salt as the first two characters of the output. It also only uses the first eight characters of str
, so longer strings that start with the same eight characters will generate the same result (when the same salt is used).
La funzione utilizza algoritmi diversi a seconda di come si formatta il sale. Alcuni algoritmi sono molto deboli e quelli forti potrebbero non essere disponibili su tutti i sistemi. Quindi, a seconda dell'algoritmo utilizzato, ci sono un certo numero di problemi qui:
- Per alcuni algoritmi
crypt()
applica solo un round di hashing. È troppo veloce e consentirà un attacco di forza bruta.
- In alcune circostanze
crypt()
utilizzerà MD5, che è noto per essere debole.
- Solo l'utilizzo dei primi otto caratteri annulla completamente i vantaggi delle password lunghe.
Pertanto suggerisco di passare a password_hash()
. Ti permette di usare bcrypt - un algoritmo collaudato. Quindi puoi dire con orgoglio al mondo del tuo piano di hashing.