Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Crittografa le password su SQL Server 2008 utilizzando SHA1

Password hash e salt in C#

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

https://www.bentasker.co.uk/blog/security/201-perché-dovresti-chiedere-come-vengono-memorizzate-le-tue-password

Come ho affermato nei miei commenti, l'hashing delle password è qualcosa che probabilmente non dovresti fare da solo.

Alcune cose da notare:

  • SHA1 non è consigliato per le password
  • Le password devono essere salate
  • Dovresti utilizzare un framework userstore verificato piuttosto che tentare di crearne uno tuo, poiché probabilmente "commetterai un errore"
  • Sono sicuro che ce ne sono molti altri

Detto questo , per soddisfare la tua domanda specifica, vorresti qualcosa del genere:

Users
----
userId
passwordHashed

passwordHashed memorizza una versione con hash della password dell'utente (la password in testo normale non viene mai archiviata da nessuna parte nella persistenza.)

per il controllo della password valida viene eseguita una cosa del genere:

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

Per inserire/aggiornare le password utente, è necessario assicurarsi di memorizzare la password con hash e non la password in testo normale, in quanto tale;

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

o

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

MODIFICA:

mi sono appena reso conto che stai chiedendo come realizzare l'hash in C#, non in SQL. Puoi eseguire quanto segue (tratto da hashing con SHA1 Algoritmo in C# ):

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

Il tuo snip di codice potrebbe essere:

            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);

Dovresti anche notare che dovresti parametrizzare i tuoi parametri nella tua procedura memorizzata piuttosto che passarli nel modo in cui sei, il che sembra che tu abbia già una domanda separata al riguardo.