SQL Server PWDEncrypt值比较

时间:2009-04-24 14:15:07

标签: sql-server sql-server-2005 encryption hash passwords

我认为我要提出的问题是不可能的,但是,我认为这值得一试。

我们有一个使用SQL Server PWDEncrypt和PWDCompare函数的应用程序。

系统的一部分会创建用户副本(相同的登录名和密码)。由于系统中的一个错误,它不是复制二进制存储密码的PWDEncrypt,而是执行另一个密码的PWDEncrypt。因此二进制值不匹配。

是否可以确定两个二进制值是否是相同密码的哈希值?

e.g。 PWDEncrypt('abc')= PWDEncrypt('abc')

如果我能做到这一点,那就意味着我可以找出这个bug实际受影响的用户数量,而不是必须处理数千个用户!

编辑:为了澄清,PWDEncrypt('abc')= PWDEncrypt('abc')将不会返回true,因为密码被散列为不同的值。

虽然我知道无法从散列中获取密码,但是PWDCOMPARE('abc',PWDENCRYPT('abc'))工作,因此,内部SQL Server必须做的不仅仅是散列您正在比较的密码和检查值是否相同。

3 个答案:

答案 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即可查看结果。