【问题标题】:Simulating MySql OLD_PASSWORD in .NET or MS SQL?在 .NET 或 MS SQL 中模拟 MySql OLD_PASSWORD?
【发布时间】:2009-08-07 06:38:10
【问题描述】:

我在 .NET 中开始了一个新项目,它使用 MySql 中的一些旧系统数据库。存储在 mysql 中的数据会定期传输到我们系统工作的 MS Sql。 我需要使用用户的登录名和密码对用户进行身份验证。用户的密码存储为 mysql OLD_PASSWORD 函数生成的哈希值。 有没有办法使用 Ms Sql 或 .NET 生成这样的哈希?

【问题讨论】:

  • 我看不到 OLD_PASSWORD 使用什么算法。此外,MySql 手册说“PASSWORD() 函数由 MySQL 服务器中的身份验证系统使用;您不应该在自己的应用程序中使用它。为此,请考虑使用 MD5() 或 SHA1()。”因此,在不知道算法的情况下,我们无法在 .NET 中找到如何做到这一点。

标签: .net mysql sql-server


【解决方案1】:

我在http://www.yourhelpcenter.de/2009/06/mysql-alten-md5-hash-in-c-berechnen-16-stellig/找到了一个

public static string mysql_old_password(string sPassword)
{
    UInt32[] result = new UInt32[2];
    bool bDebug = false;
    UInt32 nr = (UInt32)1345345333, add = (UInt32)7, nr2 = (UInt32)0x12345671;
    UInt32 tmp;

    char [] password = sPassword.ToCharArray();
    int i;

    for (i = 0; i < sPassword.Length; i++)
    {
        if (password[i] == ' ' || password[i] == '\t')
            continue;

        tmp = (UInt32)password[i];
        nr ^= (((nr & 63) + add) * tmp) + (nr << 8);
        nr2 += (nr2 << 8 ) ^ nr;
        add += tmp;
    }

    result[0] = nr & (((UInt32)1 << 31) - (UInt32)1);
    UInt32 val = (((UInt32)1 << 31) - (UInt32)1);
    result[1] = nr2 & val;
    string hash = String.Format("{0:X}{1:X}", result[0], result[1]);
    return hash.ToLower();
}

【讨论】:

  • @user8084772 这篇文章的第一件事是指您自己的网站。没有人从这篇文章中赚钱,它可以被视为有目的的教育。请参阅this site about copyright and fair use,或者请链接到合法参考,这确实是侵犯版权。
  • @user8084772 另外,我花时间谷歌翻译了你网站上的大红框,但如果它是用英文写的,人们在复制你的代码之前实际上会三思而后行。对于不会说德语的人来说,整个页面毫无意义。
【解决方案2】:

Here 是一个 Perl 模块,它模拟 MySQL 的 password() 函数,适用于 4.0 和更早版本(现在是 OLD_PASSWORD() 函数)以及 4.1 和更高版本。

虽然我意识到它不是 .NET :-) 这是我在寻找它时发现的唯一一段代码(除了 MySQL 源代码),尽管我需要 Java 实现。它对我有用并有助于迁移 - 也许您可以将它移植到 .NET 或将其作为外部进程运行。

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 2011-06-12
    • 2011-12-15
    • 2013-10-20
    • 2012-10-27
    • 2016-10-02
    • 2018-07-19
    • 2010-10-03
    • 2013-06-25
    相关资源
    最近更新 更多