散列MySql密码给出:“不再支持使用旧密码进行身份验证,使用4.1样式密码”

时间:2015-06-05 16:47:08

标签: c# mysql asp.net database-security

我尝试从ASP.NET(Razor)网页连接到MySql(版本5.0.95)数据库...
(汇编MySql.Data.dll,v6.6.5.0)

首先,我尝试直接在连接字符串中指定密码,如"...;pwd=myClearPassword"。但是当试图打开时获得了错误

  

“不再支持使用旧密码进行身份验证,请使用4.1样式   密码“。

所以我现在尝试更新我的代码,如下所示:

@using MySql.Data.MySqlClient
@using System.Security.Cryptography

private const string ConnectionStringFormat = 
   "server=xxx.xx.xxx.xx;database=mydbname;uid=username;pwd={0};";      

private string GetHashedPassword(string clearPassword)
{
    var hasher = new SHA256Managed();
    var unhashedPassword = System.Text.Encoding.Unicode.GetBytes(clearPassword);
    var hashedBytes = hasher.ComputeHash(unhashedPassword);
    var hashedPassword = Convert.ToBase64String(hashedBytes);

    return hashedPassword;
}

public Dictionary<int, string> GetIdStringCollectionFromTable(string tableName)
{
    var hasehdPassword = GetHashedPassword("myClearPassword");
    var connectionString = string.Format(ConnectionStringFormat, hasehdPassword);
    MySqlConnection conn = new MySqlConnection(connectionString);
    conn.Open(); // >>>>> ERROR !!!!!!!!

    var sqlCommand = "select id, name from {0}".Fill(tableName);
    MySqlCommand command = new MySqlCommand(sqlCommand, conn);
    var reader = command.ExecuteReader();

    Dictionary<int, string> list = new Dictionary<int, string>();
    while (reader.Read())
    {
        int id = reader.GetInt32(0);
        string text = reader.GetString(1);
        list.Add(id, text);
    }
    return list;
}

但是我得到了同样的错误。问题在哪里?

PS。

在SQL服务器上,old_passwords变量设置为ON(默认值为 OFF )。我们不控制服务器,所以这个变量应保持不变。

NB。
同一个标题有很多问题。但请不要将此问题视为重复,因为问题的背景不同。对于上面的代码,我主要受this answer启发...

1 个答案:

答案 0 :(得分:1)

首先,关于身份验证的一些事情;

在开发应用程序时通常使用两种类型的身份验证:

数据库身份验证 - 这是应用程序验证访问数据库的方式

用户身份验证 - 这是用户对您的应用程序进行身份验证的方式

您链接到上面的文章是关于用户身份验证,而您的问题实际上是关于数据库身份验证。

MySQL使用的原始哈希算法(4.1之前的版本)被认为是不安全的。 4.1版实现了一种新的哈希算法。连接字符串中的密码不需要进行哈希处理,在对数据库进行身份验证期间,会在.Net连接器内部执行哈希处理(这是为您完成的)。问题是,如果您已从4.1之前的版本升级数据库而未重置密码以使用新的散列。

你可以做两件事中的任何一件来纠正这种情况。这些脚本在数据库中运行。

  1. 允许数据库接受oldstyle hash run
  2. SET old_passwords = TRUE

    1. 使用新散列设置新密码
    2. SET old_passwords = FALSE

      SET PASSWORD = PASSWORD('your_new_password_here')

      建议使用第二种方法并使用新的哈希算法,因为它使您的数据库访问更安全。