【问题标题】:SQL Server PWDEncrypt value comparisonSQL Server PWDEncrypt 值比较
【发布时间】:2010-10-21 14:59:16
【问题描述】:

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

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

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

是否有可能找出这两个二进制值是否是相同密码的哈希?

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

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

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

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

【问题讨论】:

  • 我认为 PWDCOMPARE('abc', PWDENCRYPT('abc')) 在内部工作的方式是 PWDCOMPARE 将使用 PWDENCRYPT('abc' ) 这样,PWDCOMPARE 就不必解密密码并且不知道密码是什么。

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


【解决方案1】:

看来 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 密码。

【讨论】:

    【解决方案2】:

    只需尝试使用实现 pwdencrypt('YourPa$$w0rd') 的函数来存储它,然后尝试使用内置 fct pwdcompare('The EnteredPassWord', (Select Pwd From dbo.用户其中 Uid = '用户名')) 就是这样;-)

    【讨论】:

      【解决方案3】:

      您可以在查询窗口中输入SELECT CASE WHEN PWDEncrypt('abc') = PWDEncrypt('abc') THEN 1 ELSE 0 END 并查看结果。

      【讨论】:

      • 问题是 PWDEncrypt 每次调用时都会为相同的密码返回不同的值。因此,PWDEncrypt('abc') = PWDEncrypt('abc') 始终为假。我想知道是否还有其他方法可以进行该检查。
      • 这很有趣:它在我的系统上返回 1。重复调用必须优化掉:ick!
      • 这似乎对我不起作用,当我运行它时,结果总是为零。每次我运行 PWDEncrypt('abc') 都会返回不同的值
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      相关资源
      最近更新 更多