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

11

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

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

Cruz
fonte
Sua pergunta está muito relacionada a essa pergunta.
Broam 25/11/2009

Respostas:

11

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

O salt e a senha são agrupados, passados ​​por uma função de fortalecimento e codificados usando uma variante no 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./]
SimonJ
fonte
8

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

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

Enquanto a codificação crypt () usa esse 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 sal aleatório, executar a função hash e codificá-la usando a codificação anterior.

Eu recomendo a leitura dessas duas excelentes postagens: "Hash de senha com MD5-crypt em relação ao MD5" e "Implementação de SHA512-crypt vs MD5-crypt" , para obter uma explicação mais completa.

Marco
fonte
2

Você está procurando o algoritmo usado?

Tradicionalmente, as versões Unix e Linux anteriores 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, apareceu um suporte mais modular para algoritmos adicionais, incluindo o Blowfish. O GNU libc usado 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 detalhados da Wikipedia (consulte a página em Crypt_ (Unix) ) ou do google para 'crypt unix' ou 'crypt linux'.

Christopher Cashell
fonte