2008-12-05 16 views
7

Estoy reescribiendo un sitio web PHP en ASP.NET MVC. Me gustaría mantener la misma base de usuarios pero las contraseñas son hash usando la función PHP crypt(). Necesito la misma función en .Net para poder hacer una contraseña al iniciar sesión y compararla con la contraseña hash en la base de datos del usuario.Función PHP crypt() en .Net?

cripta en este caso, está utilizando la aplicación CRYPT_MD5 - los hashes de todo comenzar con $ 1 $

He intentado Phalanger pero no tiene una implementación de la función MD5 cripta.

¿Alguien sabe de uno en .Net? El ejemplo de C# de crypt() en CodeProject usa DES, no MD5.

He intentado el siguiente código en C#, con diferentes permutaciones de salt + password, password + salt y salt con y sin $ 1 $ prefix y $ sufijo. Ninguno da mismo resultado que PHP:

static void Main(string[] args) 
{ 
    const string salt = "somesalt"; 
    const string password = "fubar"; 
    const string plaintextString = password + salt; 
    byte[] plaintext = GetBytes(plaintextString); 
    var md5 = MD5.Create("MD5"); 
    byte[] hash = md5.ComputeHash(plaintext); 
    string s = System.Convert.ToBase64String(hash); 
    Console.WriteLine("Hash of " + password + " is " + s); 
    Console.ReadKey(); 
} 

private static byte[] GetBytes(string s) 
{ 
    var result = new byte[s.Length]; 
    for (int i = 0; i < s.Length; i++) 
     result[i] = (byte)s[i]; 
    return result; 
} 
+0

MD5 no se considera un control seguro y es posible que desee actualizar sus sistemas de SHA-256. – TravisO

+0

btw, 'Consola.WriteLine ("Hash of {0} es {1}", contraseña, s); ' – abatishchev

+1

Abatishchev, este fue un pico rápido para comprobar si podía generar el mismo hash que PHP para una cadena de entrada determinada. Su comentario está completamente fuera del tema y no es útil. –

Respuesta

0

La única solución que encontré fue a llamar a un script PHP trivial de que simplemente realiza un hash de la cadena de entrada y lo devuelve :-(

2

Hay algunos métodos para hash MD5 .NET, System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, format) es el más fácil de usar, a pesar de que es un bocado. Simplemente pase "md5" como formato.

Dependiendo de cómo PHP está haciendo esto, puede ser tan simple como cortar el $1$ desde el principio del hash al importarlo. Puede ser más complejo. Si puede publicar un ejemplo de contraseña/hash, veré si puedo crear C# que genere el mismo hash de esa contraseña para usted.

+0

He probado el hash MD5 en .Net, pero resulta en un hash diferente de lo que estoy viendo con PHP crypt() –

1

¿Has echado un vistazo a .NET MD5 class? $ 1 $ es parte de una sal de 12 caracteres.

0

Actualmente estoy trabajando en exactamente el mismo problema. La solución que se me ocurrió fue llamar a la función php directamente a través de una llamada extern:

[DllImport("php5ts.dll", EntryPoint = "crypt", CharSet = CharSet.Ansi)] 
private static extern string crypt(string str, string salt); 

Esto funciona bien para PHP versión 5.2.10 cuando se ejecuta el servidor WebDev locales, IIS5 y IIS6 pero si se utiliza el II7 El proceso de trabajo de ASP.Net se bloquea con una excepción no controlada. (Actualizaré mi respuesta tan pronto como encuentre una resolución)

También incluimos un indicador de tipo de contraseña que nos permite utilizar la implementación .Net MD5 para todos los usuarios nuevos y convertir a los usuarios existentes a medida que actualizan su detalles.

Actualización: El problema con referencia a php5ts.dll directamente de IIS7 parece ser más probable a usar 64 bits de Windows, por lo que esta solución podría trabajar en una instalación de 32 bits de Windows 7 o Server 2008, sin embargo no puedo para verificar esto Resultó que nuestro sitio existente estaba usando DES, así que pudimos usar la implementación crypt de CodeProject, gracias por la referencia de Mike.