【发布时间】:2011-08-24 13:11:59
【问题描述】:
我正在寻找一个使用 T-SQL 存储过程对密码进行加盐的示例。当然还有用于验证用户的匹配过程。
CREATE PROC ChangePassword(@Username nVarChar(50), @Password nVarChar(50))
CREATE PROC ValidateUser(@Username nVarChar(50), @Password nVarChar(50))
【问题讨论】:
我正在寻找一个使用 T-SQL 存储过程对密码进行加盐的示例。当然还有用于验证用户的匹配过程。
CREATE PROC ChangePassword(@Username nVarChar(50), @Password nVarChar(50))
CREATE PROC ValidateUser(@Username nVarChar(50), @Password nVarChar(50))
【问题讨论】:
首先,我要在这里冒昧地说,在数据库中散列密码通常是安全性方面的不良做法。您不会受到流量嗅探器监视数据库流量的保护。防止这种情况的唯一方法是确保您与数据库的连接是加密的,这通常意味着到数据库的所有其他流量都将被加密。可以解决这个问题,但更好的解决方案是让应用程序进行散列。
正如 Sam Saffron 所说,您可以使用 Hashbytes 函数来获得 SHA1 哈希。如果您想要更好的算法,您需要创建一个 CLR 过程。 Salting 将涉及为每个用户存储一个加密的随机值,然后将该值附加到密码并通过 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 类之类的东西来生成它。
【讨论】:
【讨论】:
newid 在密码学上不强。 MD5 或 SHA1 都不是,但是,一切都以度为单位......
您是否考虑过在应用程序级别将密码加盐作为应用程序服务器的服务器硬件,尤其是。 Cpu 可能比 dbms 更适合处理散列和加盐?
【讨论】: