Come generare un casuale, lungo il sale per l'uso in hashing?
-
19-09-2019 - |
Domanda
Qual è un modo in PHP per fare un caso, sale lunghezza variabile per l'uso in hashing? Diciamo che voglio fare un sale lungo 16 caratteri - come lo farei
Nessuna soluzione corretta
Altri suggerimenti
modifica: l'estensione mcrypt è stato sconsigliato.
Per i nuovi progetti dare un'occhiata a
random_bytes (int $ lunghezza)
e il sodio (come di php 7.2 core-) estensione.
Se il mcrypt estensione è disponibile si può semplicemente utilizzare mcrypt_create_iv (dimensione, fonte) per creare un sale.
$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
var_dump($iv);
Dal momento che ogni byte della "stringa" può essere compreso tra 0-255 hai bisogno di una funzione binaria di sicurezza per salvare / recuperarla.
seconda del sistema operativo, qualcosa di simile:
$fh=fopen('/dev/urandom','rb');
$salt=fgets($fh,16);
fclose($fh);
Si deve leggere sul comportamento dei urandom casuale e.
Mentre altri hanno giustamente sottolineato che non vi alcuni problemi con MD5 e ripetuto hashing, per le password (cioè relativamente brevi stringhe) attacchi di forza bruta prendere la stessa quantità di tempo a prescindere da come sofisticato algoritmo di hash è.
C.
Ecco ho trovato una funzione per generare stringa casuale:
/* random string */
function rand_string( $length ) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$size = strlen( $chars );
for( $i = 0; $i < $length; $i++ ) {
$str .= $chars[ rand( 0, $size - 1 ) ];
}
return $str;
}
Ci sono due prerequisiti per una buona sale: deve essere lunga, e deve essere casuale. Ci sono molti modi per ottenere questo risultato. Si potrebbe utilizzare una combinazione di microtime
e rand
, per esempio, ma si potrebbe andare a lunghezze ancora maggiori per garantire che il sale è unico nel suo genere.
Mentre la probabilità di una collisione è trascurabile, tenere a mente che il vostro sale hashing con MD5 o altri algoritmi di collisione incline ridurrà la possibilità che il vostro sale è unico nel suo genere per nessuna ragione.
EDIT: rand()
Sostituto per mt_rand()
. Come ha osservato Michael, è meglio che rand
.