首先,我建议在散列之前使用随机 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)))
)