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 № 1Al 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;
}