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

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

我想要做的是创建一个随机密码并将散列密码保存到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,将其与密码组合,并执行哈希以获得相同的结果。

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复