更新大型数据库以散列存储在 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)))
)
今天我起床 运行 我公司数据库的旧版本/开发版本,这是我在查看数据库 '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)))
)