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.