我认为我要问的是不可能的,但是,我觉得这里值得一试。

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

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

是否有可能找出两个二进制值是否是相同密码的散列?

例如PWDEncrypt('abc') = PWDEncrypt('abc')

如果我能做到这一点,那么这意味着我可以找出这个错误实际上影响了多少用户,而不必处理数千个!

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

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

最佳答案

似乎乔尔的陈述在 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 密码。

关于sql-server - SQL Server PWDEncrypt 值比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/786029/

10-11 20:33