T-SQL:盐渍密码

时间:2011-05-12 23:29:40

标签: tsql passwords

我正在寻找使用T-SQL存储过程腌制密码的示例。当然还有用于验证用户的匹配过程。

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

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

3 个答案:

答案 0 :(得分:14)

首先,我将在这里说道,并说数据库中的哈希密码在安全方面通常是一种不好的做法。您不会受到阻止流量嗅探器监视数据库流量的保护。防止这种情况的唯一方法是确保您与数据库的连接已加密,这通常意味着将加密数据库的所有其他流量。可以解决这个问题,但更好的解决方案是让应用程序进行散列。

正如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类生成它。

答案 1 :(得分:2)

您可以使用HASHBYTES SHA1字符串,NEWID()生成随机Guid作为salt。

答案 2 :(得分:1)

您是否考虑过将应用程序级别的密码设置为应用程序服务器的服务器硬件。 Cpu可能比dbms更适合处理散列和盐析?