代码之家  ›  专栏  ›  技术社区  ›  Robin Day

SQL Server PwdEncrypt值比较

  •  4
  • Robin Day  · 技术社区  · 17 年前

    我想我要问的是不可能的,但是,我觉得值得一试。

    我们有一个应用程序可以使用SQL服务器pwdencrypt和pwdcompare函数。

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

    是否可以找出这两个二进制值是否是同一密码的哈希值?

    例如,pwdencrypt(‘abc’)=pwdencrypt(‘abc’)

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

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

    虽然我知道从散列中获取密码是不可能的,但是pwdcompare(“abc”,pwdencrypt(“abc”)起作用,因此,在内部,SQL Server必须做的不仅仅是散列要比较的密码,并检查这些值是否相同。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Nick Kavadias    17 年前

    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中,哈希值较短,因为它不再以大写形式维护哈希值的副本,以便与敏感密码兼容。

    如果您可以使用相同的salt生成散列,那么您可以比较它们(这意味着尝试蛮力或字典攻击),看看 this article 关于如何做。它向您展示了如何使用 CryptCreateHash 功能。

        2
  •  1
  •   Tadeo Piana    14 年前

    只需尝试使用实现pwdencrypt(“yourpa$$w0rd”)的函数来存储它,然后使用内置的fct pwdcompare(“enteredpassword”,(从dbo.users中选择pwd,其中uid='username')返回位0/1) 就是这样;

        3
  •  0
  •   Joel Coehoorn    17 年前

    你只要打字就行了 SELECT CASE WHEN PWDEncrypt('abc') = PWDEncrypt('abc') THEN 1 ELSE 0 END 进入查询窗口并查看结果。

    推荐文章