Algumas vezes tentei alterar uma senha de usuário em várias máquinas Linux e quando a nova senha era semelhante à antiga, o sistema operacional reclamava que eram muito semelhantes.
Eu sempre me perguntei, como o sistema sabe disso? Eu pensei que a senha é salva como um hash. Isso significa que, quando o sistema é capaz de comparar a nova senha por similaridade, a antiga é realmente salva como texto simples?
Respostas:
Como você precisa fornecer a senha antiga e a nova ao usar
passwd
, elas podem ser comparadas facilmente em texto sem formatação, na memória, sem gravá-las em algum lugar da unidade.Na verdade, sua senha é hash quando finalmente é armazenada, mas até que isso aconteça, é claro que a ferramenta em que você digita sua senha pode acessá-la diretamente, como qualquer outro programa pode acessar as coisas que você digitou no teclado enquanto lia o STDIN.
Esse é um recurso do sistema PAM usado em segundo plano da
passwd
ferramenta. O PAM é usado pelas modernas distribuições Linux.Mais especificamente,
pam_cracklib
é um módulo para o PAM que permite rejeitar senhas com base em várias fraquezas que as tornariam muito vulneráveis.Não são apenas as senhas muito semelhantes que podem ser consideradas inseguras. O código fonte possui vários exemplos do que pode ser verificado, por exemplo, se uma senha é um palíndromo ou qual a distância de edição entre duas palavras. A idéia é tornar as senhas mais resistentes a ataques de dicionário.
Veja também a página de
pam_cracklib
manual.fonte
Pelo menos no meu Ubuntu, as mensagens "muito semelhantes" aparecem
when: "... mais da metade dos personagens são diferentes ...." (veja detalhes abaixo).graças ao suporte do PAM, conforme explicado claramente na resposta @slhck.Para outra plataforma, onde o PAM não é usado, as mensagens "muito semelhantes" são exibidas quando: "... mais da metade dos caracteres são diferentes ..." (veja detalhes abaixo)
Para verificar mais essa declaração por conta própria, é possível verificar o código-fonte. Aqui está como.
O programa "passwd" está incluído no pacote passwd:
Como estamos lidando com tecnologias de código aberto, temos acesso irrestrito ao código-fonte. Obtê-lo é tão simples quanto:
Posteriormente, é fácil encontrar o fragmento relevante de código:
Uma rápida verificação no "obscure.c" fornece isso (estou recortando e colando apenas o trecho de código relevante):
Então, agora, sabemos que existe uma função "semelhante" que, com base na verificação antiga e na nova, se ambas são semelhantes. Aqui está o trecho:
Eu não revi o código C. Limitei-me a confiar no comentário antes da definição da função :-)
A diferenciação entre plataformas compatíveis com PAM e NON-PAM é definida no arquivo "obscure.c" que está estruturado da seguinte forma:
fonte
passwd
solicitar senhas antigas e novas é a resposta . O restante desta resposta é irrelevante.A resposta é muito mais simples do que você pensa. De fato, quase se qualifica como mágica, porque depois que você explica o truque, ele desaparece:
Ele sabe que sua nova senha é semelhante ... Porque você digitou a antiga apenas um momento antes.
fonte
Embora as outras respostas estejam corretas, vale a pena mencionar que você não precisa fornecer a senha antiga para que isso funcione!
De fato, pode-se gerar um monte de senha semelhante à nova senha fornecida, misturá-los e depois verificar se algum desses hashes corresponde ao antigo. Se for esse o caso, a nova senha será julgada semelhante à antiga! :)
fonte
n
), que é62 * (n!)/(6 * (n - 3)!)
igual a 13540 para a senha de 12 caracteres. Mas se alguém pensa em algo diferente, a equação é inútil, então por que se preocupar?Um aspecto não foi coberto: histórico de senhas. Alguns sistemas suportam isso. Para fazer isso, ele mantém um histórico de senhas e as criptografa com a senha atual. Quando você altera sua senha, ela usa a senha "antiga" para descriptografar a lista e verificar. E quando define uma nova senha, salva a lista (novamente) criptografada com uma chave derivada da nova senha.
É assim que
remember=N
funciona no PAM (armazenado em/etc/security/opasswd
). Mas também o Windows e outros fornecedores de Unix oferecem funções semelhantes.fonte