Algoritmo detrás de MD5Crypt

Estoy trabajando con Subversion basado en Windows y me gustaría escribir una utilidad sencilla en .NET para trabajar con el file de contraseña de Apache. Entiendo que usa una function denominada MD5Crypt, pero parece que no puedo encontrar una descripción del algorithm más allá de eso, en algún momento usa MD5 para crear un hash.

¿Alguien puede describir el algorithm MD5Crypt y el formatting de línea de contraseña?

Una descripción textual precisa del algorithm crypt actualizado para usar con sha256 y sha512 está en http://www.akkadia.org/drepper/SHA-crypt.txt

Incluye contrastes con el algorithm MD5, por lo que debe darle lo que está buscando.

Puede encontrar una implementación de md5crypt en el package tcllib. La descarga está disponible desde sourceforge .

También puede encontrar un ejemplo de md5crypt compatible con apache en el código fuente para CAS Generic Handler

MD5Crypt es básicamente un reemploop para la antigua function cripix de Unix. Fue introducido en freebsd, y ha sido adoptado por otros grupos también.

La idea básica es esta:

  • un hash es una buena forma de almacenar una contraseña
    • toma la contraseña ingresada por el usuario y la hash
    • compararlo con el hash almacenado
    • si el hash es el mismo, las passwords coinciden

Pero hay un problema:

  • Supongamos que elige la contraseña "jeff" y también elijo "jeff".
  • Ahora, ambos hashes de contraseña son iguales.
  • Entonces, si veo los códigos hash almacenados, sabré que tu contraseña es la misma que la mía, "jeff".

Entonces, podemos agregar una cadena "sal" a la contraseña.

  • Esto puede ser algo aleatorio.
  • Supongamos que para su count es "zuzu" y para mi count es "rjrj".
  • Ahora tenemos la cadena "jeffzuzu" para su contraseña y "jeffrjrj" como contraseña.
  • Ahora tenemos diferentes valores hash para nuestra contraseña.
  • Podemos almacenar de forma segura el valor de sal con la contraseña hash, ya que incluso conocer el valor de sal no ayudará a descodificar el hash.

Usted menciona .net, hay un puntero en otro foro para esto:

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

HTH!

El process es bastante complicado … la sal y la contraseña se mezclan una y otra vez, pero 1000 veces. Además, la encoding base64 usa un alfabeto diferente y el relleno se elimina del final.

Lo mejor sería encontrar una biblioteca para usar, como glibc en cygwin.

Como codifica contra Apache de todos modos, eche un vistazo a la implementación de crypt-md5 de Apache .

El algorithm original (creo) en C se puede encontrar aquí . Difiere de la implementación anterior solo por el diferente número mágico.