我想要做的是创建一个随机密码并将散列密码保存到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方法返回的内容。
答案 0 :(得分:0)
基本上,通过使用此PWDENCRYPT方法生成哈希,您的salt已存储在数据库中。如果你看一下公式来创建hash1值,那么普通的盐值会包含在" plaintext"在hash1值本身内,在实际的HASHBYTES调用之外。
set @hash1 = 0x0200 + @salt1 + Hashbytes('SHA2_512', Cast(@pswd1 As varbinary(max)) + @salt1);
PWDCOMPARE知道在进行比较时如何考虑盐,这就是为什么使用什么盐值并不重要的原因。在PWDCOMPARE的某个地方,它知道从哈希中的特定位置获取salt,将其与密码组合,并执行哈希以获得相同的结果。