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

时间:2009-08-07 06:38:10

标签: .net mysql sql-server

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

2 个答案:

答案 0 :(得分:4)

我在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();
}

答案 1 :(得分:0)

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

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