【问题标题】:Updating a large database to hash out stored passwords in MS SQL Server 2008更新大型数据库以散列 MS SQL Server 2008 中存储的密码
【发布时间】:2018-04-12 00:28:23
【问题描述】:

今天我在公司数据库的旧版本/开发版本上启动并运行,我在查看数据库的“成员”表时发现的一件事是密码以明文形式存储,而不是被散列和盐渍。所以我的问题是如何遍历大型数据库以将这些明文密码转换为散列密码。

数据以以下格式存储 dbo.Tradesmen 密码列被简单地称为Password

感谢您的帮助

【问题讨论】:

  • 您必须修复同时使用的数据和应用程序。要修复数据,您只需逐行进行。那里别无选择。

标签: sql-server hash iteration salt


【解决方案1】:

首先,我建议在散列之前使用随机 GUID 对密码进行加盐处理。这将确保没有相同的哈希值,即使两个用户碰巧使用相同的密码:

ALTER TABLE dbo.Tradesmen
ADD Salt uniqueidentifier;

设置列,以便在插入新记录时自动创建新的 Salt:

ALTER TABLE dbo.Tradesmen
ADD CONSTRAINT salt_def  
DEFAULT NewID() FOR Salt;

使用 Salt 填充所有现有记录:

UPDATE dbo.Tradesmen
SET Salt = NewID()
WHERE Salt is null;

创建一个字段来存储散列密码:

ALTER TABLE dbo.Tradesmen
ADD PasswordHash BINARY(64);

然后运行更新以创建散列和加盐密码:

UPDATE dbo.Tradesmen
SET PasswordHash = HASHBYTES('SHA2_512', Password+Cast(Salt as NVARCHAR(36)))
WHERE PasswordHash is null and Password != '';

验证后,擦除密码字段。要验证用户,我建议使用这样的函数(假设用户帐户位于名为 User 的字段中)。如果返回一条记录,则登录组合正确:

CREATE Function dbo.VerifyUser (
    @p_User varchar(50),
    @p_Password varchar(50)
)
RETURNS TABLE
AS
RETURN
(
    SELECT Top 1 User
    from dbo.Tradesmen
    where User = @p_User
        and
        PasswordHash = HASHBYTES('SHA2_512', @p_Password+CAST(Salt as NVARCHAR(36)))
)

【讨论】:

  • 这对于纯粹的 t-SQL 解决方案很有用,但值得注意的是,使用 SHA 哈希作为密码会使您容易受到暴力破解。最好使用 PBKDF2。见stackoverflow.com/questions/7837547/…
猜你喜欢
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多