Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verschlüsseln Sie Passwörter auf SQL Server 2008 mit SHA1

Hash- und Salt-Passwörter 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

Wie ich in meinen Kommentaren gesagt habe, ist das Hashen von Passwörtern etwas, das Sie wahrscheinlich nicht selbst tun sollten.

Ein paar Dinge zu beachten:

  • SHA1 wird für Passwörter nicht empfohlen
  • Passwörter sollten gesalzen werden
  • Sie sollten ein verifiziertes Userstore-Framework verwenden, anstatt zu versuchen, Ihr eigenes zu erstellen, da Sie es wahrscheinlich "falsch machen"
  • Ich bin mir sicher, dass es noch viele mehr gibt

Davon abgesehen , um Ihre spezielle Frage zu beantworten, möchten Sie etwa Folgendes:

Users
----
userId
passwordHashed

passwordHashed speichert eine gehashte Version des Passworts des Benutzers (das Klartext-Passwort wird niemals dauerhaft irgendwo gespeichert.)

um nach einem gültigen Passwort zu suchen, wird so etwas gemacht:

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

Beim Einfügen/Aktualisieren von Benutzerkennwörtern müssen Sie sicherstellen, dass das gehashte Kennwort gespeichert wird und nicht das Klartextkennwort als solches;

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

oder

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

BEARBEITEN:

Ich habe gerade festgestellt, dass Sie fragen, wie Sie den Hash in C # und nicht in SQL ausführen können. Sie könnten Folgendes durchführen (entnommen aus Hashing mit SHA1 Algorithmus in C# ):

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

Ihr Codeausschnitt könnte wie folgt aussehen:

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

Sie sollten auch beachten, dass Sie Ihre Parameter für Ihre gespeicherte Prozedur parametrisieren sollten, anstatt sie so zu übergeben, wie Sie es tun - was so aussieht, als hätten Sie diesbezüglich bereits eine separate Frage.