我认为我要提出的问题是不可能的,但是,我认为这值得一试。
我们有一个使用SQL Server PWDEncrypt和PWDCompare函数的应用程序。
系统的一部分会创建用户副本(相同的登录名和密码)。由于系统中的一个错误,它不是复制二进制存储密码的PWDEncrypt,而是执行另一个密码的PWDEncrypt。因此二进制值不匹配。
是否可以确定两个二进制值是否是相同密码的哈希值?
e.g。 PWDEncrypt('abc')= PWDEncrypt('abc')
如果我能做到这一点,那就意味着我可以找出这个bug实际受影响的用户数量,而不是必须处理数千个用户!
编辑:为了澄清,PWDEncrypt('abc')= PWDEncrypt('abc')将不会返回true,因为密码被散列为不同的值。
虽然我知道无法从散列中获取密码,但是PWDCOMPARE('abc',PWDENCRYPT('abc'))工作,因此,内部SQL Server必须做的不仅仅是散列您正在比较的密码和检查值是否相同。
答案 0 :(得分:2)
似乎Joel的陈述在SQL Server 2000中是正确的,但在SQL Server 2005中却没有。
当你在2000年的同一个语句中一起生成哈希时,它们最终会得到相同的盐(开头的随机种子数),这使它们相同。 在2005年,总会生成不同的盐,因此它们永远不会匹配
如果您在SQL Server 2000上尝试此操作:
PRINT PWDEncrypt('abc')
PRINT PWDEncrypt('abc')
PRINT PWDEncrypt('aaa')
PRINT PWDEncrypt('bbb')
你总是在哈希的开头有相同的盐,而在2005年它总是不同的。另请注意,在SQL Server 2005中,哈希值较短,因为它不再以大写形式维护哈希的副本,以用于区分大小写的密码兼容性。
如果你可以使用相同的盐生成哈希,那么你可以比较它们(这意味着尝试暴力或字典攻击)看看this article如何做到这一点。它向您展示了如何使用CryptCreateHash函数在C中破解SQL Server密码。
答案 1 :(得分:1)
尝试使用实现pwdencrypt('YourPa $$ w0rd')的函数来存储它,然后尝试另一个返回带有内置fct pwdcompare的BIT 0/1('The EnteredPassWord',(选择Pwd来自dbo)。 Uid ='UserName')的用户)) 就是这样; - )
答案 2 :(得分:0)
您只需在查询窗口中输入SELECT CASE WHEN PWDEncrypt('abc') = PWDEncrypt('abc') THEN 1 ELSE 0 END
即可查看结果。