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

时间:2015-06-10 19:33:23

标签: sql-server tsql stored-procedures

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

我正在使用this site.中的“随机密码创建程序” 以下是我将其哈希版本保存到数据库的方法。

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)

两者都返回1.那么有什么不对吗?或者盐不重要? @ salt2是generate方法返回的内容。

1 个答案:

答案 0 :(得分:0)

基本上,通过使用此PWDENCRYPT方法生成哈希,您的salt已存储在数据库中。如果你看一下公式来创建hash1值,那么普通的盐值会包含在" plaintext"在hash1值本身内,在实际的HASHBYTES调用之外。

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

PWDCOMPARE知道在进行比较时如何考虑盐,这就是为什么使用什么盐值并不重要的原因。在PWDCOMPARE的某个地方,它知道从哈希中的特定位置获取salt,将其与密码组合,并执行哈希以获得相同的结果。