Como um hash de senha é codificado no arquivo de senha de sombra?

7

Estou aprendendo sobre a segurança de senhas do Linux (mais curiosidade do que qualquer coisa útil) e entendo que a senha real é armazenada em hash e armazenada no arquivo de senhas shadow. O que eu não tenho certeza, e não consegui encontrar no meu breve Googling, é o que a codificação é usada para codificar o valor do hash (e o valor do salt). Obviamente não é hexadecimal, e é obviamente texto, excluindo o caractere : . Alguém aqui pode me dizer qual é essa codificação?

Edit: Eu entendo o hashing (MD5, SHA-X), o salt e o especificador hash. O que eu estou procurando é o método de converter os resultados de hash (uma matriz de bytes (byte [])) para a seqüência de caracteres que eu vejo no arquivo, ou seja: a codificação.

    
por C. Ross 25.11.2009 / 19:51

4 respostas

10

No caso de MD5 crypt (), o salt é apenas uma string aleatória de até 8 caracteres de [a-zA-Z0-9 ./].

O sal e a senha são então reunidos, passados por uma função de fortalecimento e, em seguida, codificados usando uma variante em Base64:

  • o estado MD5 (128 bits) é embaralhado e dividido em 6 grupos, cada um contendo 3 bytes (o grupo final inclui 2 bytes de preenchimento zero)
  • cada grupo de 3 bytes é então dividido em 4 blocos de 6 bits cada
  • finalmente, cada grupo de 6 bits é mapeado para um caractere no intervalo [a-zA-Z0-9 ./]
por 25.11.2009 / 21:28
4

A primeira parte do hash entre os $ 'indica qual algoritmo está sendo usado.

Confira o link para obter uma lista do significado dos diferentes valores.

    
por 25.11.2009 / 20:04
3

Se você quiser apenas saber como a senha é codificada, crypt () usa uma codificação especial do tipo Base64.

A codificação Base64 usa o seguinte conjunto de caracteres: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /

Enquanto a crypt () codificação usa este conjunto de caracteres: ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Além disso, ao contrário do Base64, não há preenchimento "=".

Por outro lado, as implementações crypt () do MD5, SHA-X, etc. fazem mais do que apenas gerar um salt aleatório, executar a função hash e codificá-lo usando a codificação anterior.

Eu recomendo ler estes dois grandes posts: "Senha hashing com MD5-crypt em relação ao MD5" e "Implementação do SHA512-crypt vs MD5-crypt" , para uma explicação mais completa.

    
por 14.04.2013 / 22:09
2

Você está procurando o algoritmo usado?

Tradicionalmente, as variantes UNIX e Linux usavam um DES enfraquecido com base no máximo de 8 caracteres da senha. A maioria das instalações modernas do Linux usa hashes MD5 para as senhas, e algumas suportam SHA. Além disso, mais suporte modular para algoritmos adicionais tem aparecido, incluindo Blowfish. A GNU libc usada pela maioria dos Linux suporta DES, MD5 e SHA, oferecendo algumas opções.

O tipo específico de algoritmo de hash usado é especificado como o início da senha como $ DIGIT $. Por exemplo, $ 1 $ é MD5.

Você pode obter detalhes mais aprofundados da Wikipedia (veja a página em Crypt_ (Unix) ) ou google para 'crypt unix' ou 'crypt linux'.

    
por 25.11.2009 / 20:06