/ / Conversión manual de contraseña y sal para comparar con contraseña de ASPNETDB - c #, asp.net, .net, hash

Conversión manual de contraseña y sal para comparar con la contraseña de ASPNETDB - c #, asp.net, .net, hash

Estoy tratando de comparar manualmente el aspnetdbcampo de contraseña con una contraseña con hash manual en mi extremo para verificar la validez (no puedo usar la implementación de Membresía predeterminada porque estoy usando una personalizada). De todos modos, estoy tomando la sal de la contraseña Base64 del registro y usando el siguiente algoritmo para obtener el hash salado:

static byte[] GenerateSaltedHash(byte[] plainText, byte[] salt)
{
HashAlgorithm algorithm = new SHA256Managed();

byte[] plainTextWithSaltBytes =
new byte[plainText.Length + salt.Length];

for (int i = 0; i < plainText.Length; i++)
{
plainTextWithSaltBytes[i] = plainText[i];
}
for (int i = 0; i < salt.Length; i++)
{
plainTextWithSaltBytes[plainText.Length + i] = salt[i];
}

byte[] hash = algorithm.ComputeHash(plainTextWithSaltBytes);

return hash;
}

Entonces tomo esos bytes y comparo con unaConvert.GetBase64Bytes (MembershipUser.Password). Aunque hay una desconexión en algún lugar, ya que los bytes que recibo del método Convert y mi hash computado nunca son los mismos, incluso cuando sé que las contraseñas son las mismas.

¿Alguna idea de a dónde me voy mal?

Respuestas

0 para la respuesta № 1

Al mirar la fuente de SqlMembershipProvider, parece que copian la sal antes de la contraseña:

static byte[] GenerateSaltedHash(byte[] plainText, byte[] salt)
{
HashAlgorithm algorithm = new SHA256Managed();

byte[] plainTextWithSaltBytes = new byte[plainText.Length + salt.Length];
salt.CopyTo(plainTextWithSaltBytes, 0);
plainText.CopyTo(plainTextWithSaltBytes, salt.Length);

byte[] hash = algorithm.ComputeHash(plainTextWithSaltBytes);

return hash;
}