https://crackstation.net/hashing-security.htm
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.