我最近接任了内部开发的应用程序的应用程序管理员,该应用程序没有文档也没有支持。
我发现我的前任给每个新用户提供了完全相同的初始密码,并且没有适当的密码政策要求用户更改已定义的初始密码。我知道初始密码是什么,我想开发一个SQL报告以找出谁拥有该密码,以便我可以强制更改密码。
我无法编写SQL代码来模仿应用程序的密码和盐值SHA1哈希的行为,并且需要一些帮助。
我已经建立了以下示例,以说明到目前为止我已经尝试过的方法,以便任何人都可以复制/粘贴和玩具。
测试密码: Password1234!
盐(存储在SQL DB中): PvEdk1itxYINUl1m6tMSBQ ==
密码(存储在SQL DB中): K9VK3nis2lKMjGvgkuTogK / 3Nac =
在下面,您将找到我用来做概念证明的SQL。
DECLARE @Password varchar(100) = 'Password1234!'
DECLARE @PasswordHex varbinary(max) = CONVERT(varbinary(max), @Password)
DECLARE @Salt varchar(100) = 'PvEdk1itxYINUl1m6tMSBQ=='
DECLARE @SaltHex varbinary(max)
DECLARE @PasswordSaltHex varbinary(max)
DECLARE @HashedPassHex varbinary(max)
DECLARE @HashedPass varchar(max)
--
SET @SaltHex = cast('' as xml).value('xs:base64Binary(sql:variable("@Salt"))', 'varbinary(max)')
SET @PasswordSaltHex = @PasswordHex + @SaltHex
SET @HashedPassHex = HASHBYTES('SHA1',@PasswordSaltHex)
SET @HashedPass = cast('' as xml).value('xs:base64Binary(sql:variable("@HashedPassHex"))', 'varchar(max)')
--
PRINT @Password -- OUTPUT: Password1234!
PRINT @PasswordHex -- OUTPUT: 0x50617373776F72643132333421
PRINT @Salt -- OUTPUT: PvEdk1itxYINUl1m6tMSBQ==
PRINT @SaltHex -- OUTPUT: 0x3EF11D9358ADC5820D525D66EAD31205
PRINT @PasswordSaltHex -- OUTPUT: 0x50617373776F726431323334213EF11D9358ADC5820D525D66EAD31205
PRINT @HashedPassHex -- OUTPUT: 0x727B312D682FA8766E6A498B0AF923FFDAF3778F
PRINT @HashedPass -- OUTPUT: cnsxLWgvqHZuakmLCvkj/9rzd48=
我希望 @HashedPass 的输出与上面显示的数据库中存储的密码相同,但是它们不匹配。
< br />
这使用的是SQL Server 2017,我相对确定使用的哈希算法是SHA1。
有人对我可以做什么或尝试解决我的问题有建议吗?