7 Stimmen

T-SQL: Gesalzene Passwörter

Ich bin auf der Suche nach einem Beispiel für das Salzen von Passwörtern innerhalb einer T-SQL Stored Procedure. Und natürlich die passende Prozedur, um einen Benutzer zu validieren.

CREATE PROC ChangePassword(@Benutzername nVarChar(50), @Password nVarChar(50))

CREATE PROC ValidateUser(@Benutzername nVarChar(50), @Password nVarChar(50))

15voto

Thomas Punkte 62314

Zunächst einmal lehne ich mich hier weit aus dem Fenster und behaupte, dass das Hashing von Kennwörtern in der Datenbank im Hinblick auf die Sicherheit generell eine schlechte Praxis ist. Sie wären nicht gegen Schnüffler geschützt, die den Datenverkehr zur Datenbank beobachten. Die einzige Möglichkeit, sich dagegen zu schützen, besteht darin, sicherzustellen, dass die Verbindung zur Datenbank verschlüsselt ist, was im Allgemeinen bedeutet, dass auch der gesamte andere Datenverkehr zur Datenbank verschlüsselt ist. Es ist möglich, dieses Problem zu umgehen, aber die bessere Lösung ist, die Anwendung(en) das Hashing durchführen zu lassen.

Wie Sam Saffron erklärte, können Sie die Hashbytes-Funktionen verwenden, um SHA1-Hashing zu erhalten. Wenn Sie bessere Algorithmen wünschen, müssen Sie eine CLR-Prozedur erstellen. Beim Salzen wird für jeden Benutzer ein kryptografischer Zufallswert gespeichert, der dann an das Kennwort angehängt und durch Hashbytes geleitet wird:

Create Procedure ValidateUser
    @Username nvarchar(50)
    , @Password nvarchar(50)
As

Declare @PasswordSalt varbinary(256)

Set @PasswordSalt = ( Select PasswordSalt From Users Where Username = @Username )

If @PasswordSalt Is Null
        -- generate a salt? 

Declare @Hash varbinary(max)
Set @Hash = Hashbytes('SHA1', @PasswordSalt + Cast('|' As binary(1)) + Cast(@Password As varbinary(100))

If Exists(  Select 1
            From Users
            Where Username = @Username
                And PasswordHash = @Hash )
    -- user is valid

Else
    -- user is not valid

Denken Sie daran, dass das Salz kryptographisch zufällig sein sollte, daher würde ich no empfehlen die Verwendung von NewId(). Stattdessen würde ich das mit etwas wie der Klasse RNGCryptoServiceProvider von .NET generieren.

2voto

Sam Saffron Punkte 124121

Sie können verwenden HASHBYTES um eine Zeichenkette mit SHA1 zu versehen, und NEWID() um eine zufällige Guid als Salt zu erzeugen.

1voto

Oh Chin Boon Punkte 22200

Haben Sie in Erwägung gezogen, Passwörter auf der Anwendungsebene zu salzen, da die Server-Hardware für Anwendungsserver, insbesondere die CPU, besser geeignet sein könnte als die Datenbanken, um Hashing und Salting zu verarbeiten?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X