Pergunta

Estou trabalhando com Subversion baseado em Windows e gostaria de escrever um utilitário fácil em .NET para trabalhar com o arquivo de senha do Apache.Entendo que ele usa uma função chamada MD5Crypt, mas não consigo encontrar uma descrição do algoritmo além de que em algum momento ele usa MD5 para criar um hash.

Alguém pode descrever o algoritmo MD5Crypt e o formato da linha de senha?

Foi útil?

Solução

Uma descrição textual precisa do algoritmo crypt atualizado para uso com sha256 e sha512 está em http://www.akkadia.org/drepper/SHA-crypt.txt

Inclui contrastes com o algoritmo MD5, por isso deve fornecer o que você procura.

Outras dicas

Você pode encontrar uma implementação do md5crypt no pacote tcllib. O download está disponível em sourceforge.

Você também pode encontrar um exemplo de md5crypt compatível com apache no código-fonte para o manipulador genérico CAS

MD5Crypt é basicamente um substituto para a antiga função unix crypt.Foi introduzido no freebsd e também adotado por outros grupos.

A ideia básica é esta:

  • um hash é uma boa maneira de armazenar uma senha
    • você pega a senha digitada pelo usuário e faz o hash
    • compare-o com o hash armazenado
    • se o hash for o mesmo, as senhas correspondem

Mas há um problema:

  • Suponha que você escolha a senha “jeff” e eu também escolha a senha “jeff”.
  • Agora, ambos os nossos hashes de senha são iguais.
  • Portanto, se eu vir os códigos hash armazenados, saberei que sua senha é igual à minha, "jeff".

Portanto, podemos adicionar uma string “salt” à senha.

  • Isso pode ser qualquer coisa aleatória.
  • Suponha que para sua conta seja "zuzu" e para minha conta seja "rjrj".
  • Agora fazemos o hash da string “jeffzuzu” para sua senha e “jeffrjrj” para minha senha.
  • Agora temos diferentes valores de hash para nossa senha.
  • Podemos armazenar com segurança o valor salt com a senha com hash, pois mesmo saber o valor salt não ajudará a decodificar o hash.

Você mencionou .net, há uma indicação em outro fórum para isso:

System.Security.Cryptography.MD5CryptoServiceProvider md5 = new
System.Security.Cryptography.MD5CryptoServiceProvider();

string hash =BitConverter.ToString((md5.ComputeHash(
System.Text.ASCIIEncoding.Default.GetBytes(stringtohash) ) ));

AH!

O processo é bastante complicado...o salt e a senha são misturados não uma vez, mas 1000 vezes.Além disso, a codificação base64 usa um alfabeto diferente e o preenchimento é removido do final.

A melhor coisa provavelmente seria encontrar uma biblioteca para usar, como glibc no cygwin.

Já que você codifica no Apache de qualquer maneira, dê uma olhada em Implementação do Apache de cripta-md5.

O algoritmo original (eu acho) em C pode ser encontrado aqui.Ela difere da implementação acima apenas pelo número mágico diferente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top