sql >> Databasteknik >  >> RDS >> Sqlserver

Kryptera lösenord på SQL Server 2008 med SHA1

Hash- och saltlösenord i 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

Som jag sa i mina kommentarer är att hasha lösenord något som du förmodligen inte borde göra själv.

Några saker att notera:

  • SHA1 rekommenderas inte för lösenord
  • Lösenord bör vara saltade
  • Du bör använda ett verifierat userstore-ramverk istället för att försöka skapa ditt eget, eftersom du sannolikt kommer att "göra det fel"
  • Jag är säker på att det finns många fler

Med det sagt , för att utföra din specifika fråga, skulle du vilja ha något sånt här:

Users
----
userId
passwordHashed

passwordHashed lagrar en hashad version av användarens lösenord (lösenordet i ren text lagras aldrig någonstans i beständighet.)

för att kontrollera efter giltigt lösenord görs något i stil med detta:

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

För att infoga/uppdatera användarlösenord måste du se till att lagra det hashade lösenordet, inte lösenordet i vanlig text, som sådant;

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

eller

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

EDIT:

insåg precis att du frågar hur man gör hash i C#, inte SQL. Du kan utföra följande (hämtat från Hashing med SHA1 Algoritm i C# ):

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

Ditt kodavsnitt kan vara:

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

Du bör också notera att du bör parametrisera dina parametrar till din lagrade procedur istället för att skicka dem på det sätt du är - vilket det verkar som att du redan har en separat fråga om det.




  1. Dynamisk kedjad valruta

  2. Ändra tabellkolumnnamn till versaler i postgres

  3. Var kan jag hitta en komplett lista över fördefinierade Oracle pl/SQL-undantag?

  4. MIN() vs LEAST() i MySQL:Vad är skillnaden?