Question

Qu'est-ce qu'un moyen en PHP pour faire un sel de longueur aléatoire, variable pour une utilisation dans hachant? Disons que je veux faire un sel à long 16 caractères - comment pourrais-je faire

Pas de solution correcte

Autres conseils

edit: l'extension mcrypt a été désapprouvée. Pour les nouveaux projets jeter un oeil à
random_bytes (int $ length)
et le sodium (PHP 7,2 core-) l'extension.


Si le mcrypt d'extension est disponible, vous pouvez simplement utiliser mcrypt_create_iv (taille, source) pour créer un sel.

$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
var_dump($iv);

Étant donné que chaque octet de la « chaîne » peut être comprise entre 0-255 vous avez besoin d'une fonction binaire sûre pour sauvegarder / récupérer.

en fonction de votre système d'exploitation, quelque chose comme:

$fh=fopen('/dev/urandom','rb');
$salt=fgets($fh,16);
fclose($fh);

Ne lire sur le comportement aléatoire et urandom.

Alors que d'autres ont correctement souligné qu'il ya quelques problèmes avec md5 et hachage répétées, des mots de passe (à savoir relativement courtes chaînes) attaques par force brute prennent la même quantité de temps quel que soit le degré de sophistication de l'algorithme de hachage est.

C.

Voici que je trouve une fonction pour générer chaîne aléatoire:

/* 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;
}

Il y a deux conditions préalables à un bon sel: Il doit être long, et il doit être aléatoire. Il y a plusieurs façons d'accomplir ceci. Vous pouvez utiliser une combinaison de microtime et rand, par exemple, mais vous pouvez aller encore plus loin pour vous assurer que votre sel est unique.

Alors que la probabilité d'une collision est négligeable, gardez à l'esprit que votre hachant sel avec MD5 ou d'autres algorithmes de collision sujettes permettra de réduire les chances que votre sel est unique pour aucune raison.

EDIT: rand() de remplacement pour mt_rand(). Comme Michael a noté, il vaut mieux que rand.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top