【问题标题】:T-SQL: Salted PasswordsT-SQL:加盐密码
【发布时间】: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))

【问题讨论】:

    标签: tsql passwords


    【解决方案1】:

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

    正如 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 类之类的东西来生成它。

    【讨论】:

    • Thomas,我认为加盐的原因是为了打败彩虹桌。使其具有加密安全性的理由是什么?
    • @Sam Saffron - 密码安全不如密码随机。随机性减少了盐值的聚类。
    • @Thomas ... 对不起,这里不是很痛苦,聚集盐有什么影响?
    • @Jonathan Allen - 如果您正在对密码进行哈希处理,则 Web 服务器上没有任何秘密。哈希算法不被视为秘密。回复:连接。我什至不确定您是否可以告诉 SQL Server 加密某些流量而不是其他流量。 AFAIK,要么全有,要么全无。
    • 该死,你是对的。我真的希望能够控制我是否在每个连接的基础上使用 SSL,但它真的是全有或全无。 technet.microsoft.com/en-us/library/ms177485.aspx
    【解决方案2】:

    您可以使用HASHBYTES 对字符串进行SHA1,并使用NEWID() 生成随机Guid 作为盐。

    【讨论】:

    • 也就是说,总的来说,这些天我更喜欢 BCrypt,这里有很多关于它的内容:stackoverflow.com/questions/1561174/…stackoverflow.com/questions/3722780/…
    • 虽然我不认为你可以在 T-SQL 中做 bcrypt(不是说你的安全代码应该存在于 T-SQL 中......)
    • 我也很确定 newid 在密码学上不强。 MD5 或 SHA1 都不是,但是,一切都以度为单位......
    • @Aaronaught,真的,这似乎是这段代码的错误位置,您可以使用 sql clr coldfusion.tcs.de/… 或扩展 proc 进行加密,但实际上这是错误的位置
    • @Aaronaught,强大到足以击败彩虹桌 :) 麻烦和盐渍 sha1 是你可以暴力破解它。
    【解决方案3】:

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

    【讨论】:

    • 这主要是出于好奇。也就是说,这允许多个应用程序无需构建某种中间件。
    猜你喜欢
    • 2014-01-24
    • 2015-07-19
    • 2016-04-09
    • 2014-05-03
    • 2010-11-30
    • 2012-07-05
    • 2013-09-22
    • 2011-12-06
    • 1970-01-01
    相关资源
    最近更新 更多