Pergunta

O que é uma maneira em PHP para fazer um sal de comprimento aleatório, variável para uso em hash? Vamos dizer que eu quero fazer uma longa sal de 16 caracteres - como eu iria fazê-lo

Nenhuma solução correta

Outras dicas

edit: a extensão mcrypt foi preterido. Para novos projetos dar uma olhada em
random_bytes (int $ length)
e o sódio (a partir de 7,2 php core-) extensão.


Se o mcrypt extensão está disponível, você poderia simplesmente usar mcrypt_create_iv (tamanho, fonte) para criar um sal.

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

Uma vez que cada byte do "string" pode estar na faixa entre 0-255 você precisa de uma função compatível com dados binários para salvar / recuperá-lo.

dependendo do seu OS, algo como:

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

Do ler sobre o comportamento de urandom aleatória e.

Enquanto outros têm corretamente apontou que há alguns problemas com md5 e hashing repetido, ataques de senhas (ou seja, cordas relativamente curtos) força bruta tomar a mesma quantidade de tempo, independentemente de quão sofisticado o algoritmo de hash é.

C.

Aqui é que eu encontrei a função para gerar cadeia aleatória:

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

Existem dois pré-requisitos para uma boa sal: Deve ser longa, e deve ser aleatória. Há muitas maneiras de conseguir isso. Você pode usar uma combinação de microtime e rand, por exemplo, mas você pode ir para ainda mais longe para garantir que o sal é único.

Enquanto a chance de uma colisão é neglible, tenha em mente que hashing seu sal com MD5 ou outros algoritmos de colisão propensa irá reduzir a chance de que seu sal é exclusivo para nenhuma razão.

EDIT: rand() Substituto para mt_rand(). Como Michael observou, é melhor do que rand.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top