在 .NET 或 MS SQL 中模拟 MySql OLD_PASSWORD?

Posted

技术标签:

【中文标题】在 .NET 或 MS SQL 中模拟 MySql OLD_PASSWORD?【英文标题】:Simulating MySql OLD_PASSWORD in .NET or MS SQL? 【发布时间】: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 中找到如何做到这一点。 【参考方案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:X1: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 或将其作为外部进程运行。

【讨论】:

以上是关于在 .NET 或 MS SQL 中模拟 MySql OLD_PASSWORD?的主要内容,如果未能解决你的问题,请参考以下文章

在 RDS 中访问 MySQL 或 MS SQL 时的 AWS Lambda node.js ETIMEDOUT

在 C#.NET 中对 SQL Server 的 MS 访问

在哪里存储我的数据?

将 MS SQL 存储过程移植到 MySQL

将 MS SQL SERVER 数据库导出到 MySql 数据库的最简单方法

计算 MY SQL 或 MS SQL 列中的单个项目