更新大型数据库以散列存储在 MS SQL Server 2008 中的密码

Updating a large database to hash out stored passwords in MS SQL Server 2008

今天我起床 运行 我公司数据库的旧版本/开发版本,这是我在查看数据库 'Members' table 时发现的事情之一是密码以明文形式存储,而不是经过散列和加盐处理。所以我的问题是如何遍历大型数据库以将这些明文密码转换为散列密码。

数据存储格式为 dbo.Tradesmen 密码列只是被称为 Password

感谢您的帮助

首先,我建议在对密码进行哈希处理之前用随机 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)))
)