sql >> Base de Datos >  >> RDS >> Sqlserver

Cifrar contraseñas en Sql Server 2008 usando SHA1

Contraseñas hash y salt en C#

https://crackstation.net/hashing-security.htm

https://www.bentasker.co.uk/blog/security/201-por-que-debería-preguntar-cómo-se-almacenan-sus-contraseñas

Como dije en mis comentarios, el hash de contraseñas es algo que probablemente no deberías estar haciendo tú mismo.

Algunas cosas a tener en cuenta:

  • SHA1 no se recomienda para contraseñas
  • Las contraseñas deben ser saladas
  • Debe utilizar un marco de almacenamiento de usuario verificado en lugar de intentar crear uno propio, ya que es probable que "lo haga mal"
  • Seguro que hay muchos más

Dicho esto , para cumplir con su pregunta específica, le gustaría algo como esto:

Users
----
userId
passwordHashed

passwordHashed almacena una versión codificada de la contraseña del usuario (la contraseña de texto sin formato nunca se almacena en ningún lugar de manera persistente).

para verificar la contraseña válida se hace algo como esto:

ALTER procedure [dbo].[proc_UserLogin]
 @userid varchar(20),
  @password nvarchar(50)
  As 

  declare
  @ReturnVal              varchar(500)


SET NOCOUNT ON      

  if exists(select userid,password from LoginManager where [email protected] and password=HASHBYTES('SHA1', @password))
  set @ReturnVal='0|Logged in Successfully'
  else
  set @ReturnVal='1|Login Failed/Username does not exist'

  select @ReturnVal

Para insertar/actualizar contraseñas de usuario, debe asegurarse de almacenar la contraseña cifrada, no la contraseña de texto sin formato, como tal;

INSERT INTO users(userId, passwordHashed) 
VALUES (@userId, HASHBYTES('SHA1', @rawPassword)

o

UPDATE users 
SET passwordHased = HASHBYTES('SHA1', @rawPassword) 
WHERE userId = @userId

EDITAR:

Me acabo de dar cuenta de que está preguntando cómo lograr el hash en C#, no en SQL. Puede realizar lo siguiente (tomado de Hashing con SHA1 Algoritmo en C# ):

public string Hash(byte [] temp)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(temp);
        return Convert.ToBase64String(hash);
    }
}

Su fragmento de código podría ser:

            conn.Open();
            string query = "EXEC dbo.proc_UserLogin'" + username.Text+ "', '" + this.Hash(System.Text.Encoding.UTF8.GetBytes(password.Text))+"'";
            OleDbCommand cmd = new OleDbCommand(query, conn);

También debe tener en cuenta que debe parametrizar sus parámetros a su procedimiento almacenado en lugar de pasarlos de la manera en que lo hace, lo que parece que ya tiene una pregunta separada al respecto.