O comando openssl passwd calcula o hash de uma senha digitada em tempo de execução ou o hash de cada senha em uma lista. A lista de senhas é obtida do arquivo nomeado para a opção -in file, de stdin para a opção -stdin e, caso contrário, da linha de comando. O algoritmo padrão do UNIX crypt e o algoritmo 1 de senha BSD baseado em MD5 e sua variante Apache apr1 estão disponíveis.
Entendo que o termo "hash" significa " transformar uma entrada em uma saída da qual é difícil/impossível derivar a entrada original ". Mais especificamente, a relação entrada:saída após o hash é N:M, onde M<=N (ou seja, a colisão de hash é possível).
Por que a saída de " openssl passwd
" é diferente executada sucessivamente com a mesma entrada?
> openssl passwd
Password:
Verifying - Password:
ZTGgaZkFnC6Pg
> openssl passwd
Password:
Verifying - Password:
wCfi4i2Bnj3FU
> openssl passwd -1 "a"
$1$OKgLCmVl$d02jECa4DXn/oXX0R.MoQ/
> openssl passwd -1 "a"
$1$JhSBpnWc$oiu2qHyr5p.ir0NrseQes1
Não devo entender o objetivo dessa função, porque parece que executar o mesmo algoritmo de hash na mesma entrada produz várias saídas exclusivas . Acho que estou confuso com essa aparente relação de entrada:saída N:M, em que M>N.
Esta é a sintaxe de hash de senha estendida no estilo Unix
crypt(3)
, especificamente a versão MD5 dela.A primeira
$1$
identifica o tipo de hash, a próxima parteOKgLCmVl
é o sal usado na criptografia da senha, depois o$
caractere separador até o final da linha é o hash da senha real.Portanto, se você pegar a parte salt da primeira criptografia e usá-la com as subsequentes, deverá sempre obter o mesmo resultado:
Ao alterar uma senha , você deve sempre alternar para um novo salt. Isso evita que alguém descubra depois se a nova senha era realmente a mesma que a antiga. (Se você quiser evitar a reutilização de senhas antigas, é claro que você pode fazer o hash da nova candidata de senha duas vezes: uma vez com o sal antigo e depois, se o resultado for diferente da senha antiga e, portanto, aceitável, novamente com uma nova sal.)
Se você usar
openssl passwd
sem opções, obterá ocrypt(3)
hash -compatível original, conforme descrito por dave_thompson_085. Com ele, o sal são duas primeiras letras do hash:Você não deve usar esse estilo de hash antigo em nenhuma nova implementação, pois restringe o comprimento efetivo da senha a 8 caracteres e tem muito pouco sal para proteger adequadamente contra métodos modernos.
(Uma vez calculei a quantidade de dados necessária para armazenar um conjunto completo de rainbow tables para cada
crypt(3)
hash clássico. Não me lembro do resultado exato, mas supondo que meus cálculos estivessem corretos, era da ordem de "uma pilha modesta de multi discos de -terabyte". Na minha opinião, isso o coloca dentro do intervalo "criminosos organizados podem fazer isso".)Ao contrário dos hashes normais, os hashes de senha devem usar 'salt' e devem ser lentos (geralmente por iteração) para impedir que um invasor que obtenha o(s) hash(es) recupere facilmente a(s) senha(s). Veja canonical em security.SX e muitos vinculados a ele.
A cripta original dos anos 1970(3) , agora chamada de DEScrypt para maior clareza, é (levemente) salgada :
O esquema MD5crypt ligeiramente mais recente é salgado e iterado, mas não está de acordo com os padrões modernos. Ambos e alguns dos melhores esquemas que os substituíram no Unix(es) estão detalhados em https://en.wikipedia.org/wiki/Crypt_%28C%29 .
O usuário muru está certo. A senha é salgada.
Você pode adicionar a opção
-salt string
você mesmo e o hash permanece o mesmo.