sql >> Database >  >> RDS >> Sqlserver

Versleutel wachtwoorden op Sql Server 2008 met SHA1

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.




  1. Hoe alleen datum en jaar te vergelijken in php codeigniter

  2. Opvragen van boomstructuurgegevens in SQL Server

  3. Hoe maak je een back-up en herstel je een database als een kopie op dezelfde server?

  4. Hoe verander ik het eigendom van alle objecten in een bepaald schema in PostgreSQL?