SQL 过程:生成随机密码并将其存储在数据库中

SQL Procedure: Generating random password and storing it in database

我想做的是创建一个随机密码并将散列密码保存到数据库。

我正在使用来自 this site. 的 "random password create procedure" 下面是我如何将它的散列版本保存到数据库中。

declare @salt varbinary(4) = CRYPT_GEN_RANDOM(4);
declare @hash varbinary(max); 

//random generated password gets set in @output

set @hash = 0x0200 + @salt + HASHBYTES('SHA2_512', CAST(@output AS VARBINARY(MAX)) + @salt)
update DBtable SET PwHash = @hash,PwSalt= @salt WHERE Id=1

我想知道是否应该将盐保存到数据库中?因为当我测试它时,它似乎正在使用随机生成的盐来验证密码。这是故意的吗?

测试方法。

declare @pswd1 nvarchar(max) = '_CWgDb2g'; 
declare @salt1 varbinary(4) = CRYPT_GEN_RANDOM(4);
declare @salt2 varbinary(4) = 0x6BE9FF69;
declare @hash1 varbinary(max); 
declare @hash2 varbinary(max); 
set @hash1 = 0x0200 + @salt1 + Hashbytes('SHA2_512', Cast(@pswd1 As varbinary(max)) + @salt1);
set @hash2 = 0x0200 + @salt2 + HASHBYTES('SHA2_512', Cast(@pswd1 AS varbinary(max)) + @salt2);

如果我 运行

Select 
Compare1 = PWDCOMPARE('_CWgDb2g',@hash1),
Compare2 = PWDCOMPARE('_CWgDb2g',@hash2)

两者都returns 1. 有什么问题吗?或者盐不重要? @salt2 是生成方法 returns.

本质上,通过使用此 PWDENCRYPT 方法生成哈希,您的盐已经存储在数据库中。如果您查看创建 hash1 值的公式,纯盐值包含在 hash1 值本身的 "plaintext" 中,在实际的 HASHBYTES 调用之外。

set @hash1 = 0x0200 + @salt1 + Hashbytes('SHA2_512', Cast(@pswd1 As varbinary(max)) + @salt1);

PWDCOMPARE 知道如何在执行比较时考虑盐值,这就是使用什么盐值无关紧要的原因。在 PWDCOMPARE 的某处,它知道从散列中的特定位置获取盐,将其与密码组合,然后执行散列以获得相同的结果。