我正在寻找一个使用T-SQL存储过程对密码进行盐化的示例。当然还有验证用户的匹配过程。
创建进程名(@ChangePassword nVarChar(50),@ nVarChar(50))
创建进程名(@ValidateUser nVarChar(50),@ nVarChar(50))
发布于 2011-05-13 09:49:54
首先,我要在这里大胆地说,在数据库中对密码进行散列通常是一种关于安全性的糟糕做法。您将不受监视数据库流量的流量嗅探器的保护。防止这种情况的唯一方法是确保到数据库的连接是加密的,这通常意味着到数据库的所有其他流量都将被加密。有可能解决这个问题,但更好的解决方案是让应用程序进行散列。
正如Sam Saffron所说,您可以使用Hashbytes函数来获取SHA1散列。如果你想要更好的算法,你需要创建一个CLR过程。加盐包括为每个用户存储一个加密的随机值,然后将该值附加到密码并通过Hashbytes运行它:
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类来生成它。
发布于 2011-05-13 08:40:06
您可以使用HASHBYTES来SHA1字符串,使用NEWID()来生成随机的Guid作为salt。
发布于 2011-05-13 08:27:15
您是否考虑过在应用程序级别的as.the服务器硬件上对密码进行加盐处理。Cpu可能比dbms更适合处理散列和加盐?
https://stackoverflow.com/questions/5985708
复制相似问题