Como gerar um sal aleatória, longa para uso em hash?
-
19-09-2019 - |
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
.