2012-02-23 20 views
5

Necesito autenticarme contra una tabla de membresía ASP.NET en php. La API de membresía está configurada para usar una contraseña hash.Usar la membresía ASP.NET en PHP

¿Alguien puede amablemente darme el php para hash la contraseña que vino de un formulario de inicio de sesión y compararlo con el campo sql?

Sé que la contraseña que estoy ingresando es correcta, pero no es lo mismo.

private function Auth($username, $password) 
{ 
    // Hashed password in db 
    $hash = $this->parent->_memberData['conv_password']; 

    // password passed from form 
    $bytes = mb_convert_encoding($password, 'UTF-7');  

    // Salt from db 
    $salt = base64_decode($this->parent->_memberData['misc']); 

    // hash password from form with salt 
    $hashedpassword = base64_encode(sha1($salt . $bytes, true)); 

    // Test em out 
    if ($hashedpassword == $hash) 
    { 
     $this->return_code = "SUCCESS"; 
     return true; 
    } 
    else 
    { 
     $this->return_code = "WRONG_AUTH"; 
     return false; 
    } 
} 

ACTUALIZACIÓN:

He intentado diferentes codificaciones con los mismos resultados. UTF-7, UTF-8 y UTF-16.

ACTUALIZACIÓN: He estado luchando con esto desde hace una semana. Bounty viene directamente ...

Aquí está el código .net en la forma de una prueba de unidad. La prueba de unidad funciona y los valores salen directamente de la base de datos. ¿Cuál es la traducción correcta de este código a php?

public void EncodePassword() 
     { 
     string expected = "aP/mqBu3VkX+rIna42ramuosS3s="; 
     string salt = "urIaGX0zd/oBRMDZjc1CKw=="; 
     string pass = "Comeonman"; 

     byte[] bytes = Encoding.Unicode.GetBytes(pass); 
     byte[] numArray = Convert.FromBase64String(salt); 
     byte[] numArray1 = new byte[(int)numArray.Length + (int)bytes.Length]; 
     byte[] numArray2 = null; 
     Buffer.BlockCopy(numArray, 0, numArray1, 0, (int)numArray.Length); 
     Buffer.BlockCopy(bytes, 0, numArray1, (int)numArray.Length, (int)bytes.Length); 

      HashAlgorithm hashAlgorithm = HashAlgorithm.Create("SHA1"); 
      if (hashAlgorithm != null) 
      { 
       numArray2 = hashAlgorithm.ComputeHash(numArray1); 
      } 

     Assert.AreEqual(Convert.ToBase64String(numArray2), expected); 
    } 
+0

¿Obtiene diferentes valores de hash? – MyStream

+0

Sí, los valores hash no coinciden – Darthg8r

+0

Esto podría ayudar: http://thekindofme.wordpress.com/2008/12/04/aspnet-membership-password-hashing-algorithm/ – Prescott

Respuesta

6
$password = 'Comeonman'; 
$salt = base64_decode('urIaGX0zd/oBRMDZjc1CKw=='); 
$utf16Password = mb_convert_encoding($password, 'UTF-16LE', 'UTF-8'); 
echo base64_encode(sha1($salt.$utf16Password, true)); 
0

la contraseña es definitivamente codificado como UTF-16, y la sal es definitivamente base 64 codificada, pero no creo que el resultado de la hash es base 64 codificado.

3

que sugeriría para crear un servicio web en .NET que dará acceso a la tala o cualquier otra funcionalidad de .NET para el código PHP.

Luego puede enviar solicitudes XML internamente y ver lo que obtiene.

Creo que hay algunos complementos de PHP, que pueden llamar a los servicios web .NET fácilmente.

+0

Eso no es realmente una opción en este caso, ya que estamos convirtiendo desde una aplicación de terceros .net a una aplicación de terceros php. La idea es eliminar eventualmente la aplicación .net. Pero tienes razón, eso no sería una mala idea en muchos casos. – Darthg8r

+0

Sé que es un offtopic, pero la migración de .NET a PHP? Me parece extraño. :) –

0

¿No necesita la máquina clave también para decodificar/codificar?

Cuestiones relacionadas