我正在寻找使用T-SQL存储过程进行密码加盐的示例。当然,还需要一个匹配的存储过程来验证用户。
CREATE PROCEDURE ChangePassword(@Username nVarChar(50), @Password nVarChar(50))
CREATE PROCEDURE ValidateUser(@Username nVarChar(50), @Password nVarChar(50))
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
请记住,盐值应该是密码学上随机生成的,因此我不建议使用 NewId() 函数。相反,我建议使用类似于 .NET 的 RNGCryptoServiceProvider 类来生成盐值。
newid
不具有密码学强度。MD5和SHA1也没有,但是每件事都有程度... - Aaronaught你有没有考虑在应用程序级别上对密码进行加盐,特别是对于应用服务器的硬件(尤其是 CPU),可能比数据库管理系统更适合处理哈希和加盐?