Hash- en salt-wachtwoorden in C#
https://crackstation.net/hashing-security.htm
https://www.bentasker.co.uk/blog/security/201-why-you-should-be-asking-how-your-passwords-are-stored
Zoals ik in mijn opmerkingen al zei, is het hashen van wachtwoorden iets dat u waarschijnlijk niet zelf zou moeten doen.
Een paar dingen om op te merken:
- SHA1 wordt niet aanbevolen voor wachtwoorden
- Wachtwoorden moeten worden gezouten
- U moet een geverifieerd userstore-framework gebruiken in plaats van te proberen uw eigen framework te maken, omdat u het waarschijnlijk "verkeerd zult doen"
- Ik weet zeker dat er nog veel meer zijn
Dat gezegd hebbende , om uw specifieke vraag te beantwoorden, zou u zoiets als dit willen:
Users
----
userId
passwordHashed
passwordHashed slaat een gehashte versie van het wachtwoord van de gebruiker op (het wachtwoord in platte tekst wordt nergens permanent opgeslagen.)
voor het controleren op een geldig wachtwoord wordt zoiets als dit gedaan:
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
Voor het invoegen/bijwerken van gebruikerswachtwoorden moet u ervoor zorgen dat u het gehashte wachtwoord opslaat en niet het platte tekstwachtwoord als zodanig;
INSERT INTO users(userId, passwordHashed)
VALUES (@userId, HASHBYTES('SHA1', @rawPassword)
of
UPDATE users
SET passwordHased = HASHBYTES('SHA1', @rawPassword)
WHERE userId = @userId
BEWERKEN:
realiseerde me net dat je vraagt hoe je de hash in C# kunt bereiken, niet in SQL. Je zou het volgende kunnen doen (overgenomen van Hashen met SHA1 Algoritme in C# ):
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(temp);
return Convert.ToBase64String(hash);
}
}
Je codefragment kan zijn:
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);
Houd er ook rekening mee dat u uw parameters aan uw opgeslagen procedure moet parametriseren in plaats van ze door te geven zoals u bent - het lijkt erop dat u daar al een aparte vraag over heeft.