【问题标题】:Hashing MySql passwords gives: "Authentication with old password no longer supported, use 4.1 style passwords"哈希 MySql 密码给出:“不再支持使用旧密码进行身份验证,使用 4.1 样式密码”
【发布时间】:2015-06-08 22:20:39
【问题描述】:

我尝试从 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)。我们不控制服务器,所以这个变量应该保持不变。

注意。
有很多同名的问题。但是,由于问题的上下文不同,请不要将此问题重复。上面代码的灵感主要来自this answer...

【问题讨论】:

  • 您使用的是什么版本的 MySQL 以及您使用的是什么版本的 .Net 连接器?
  • 嗨,@Kevin,我更新了 OP。

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


【解决方案1】:

首先,关于一般身份验证的几件事;

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

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

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

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

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

您可以采取以下两种方式中的任何一种来纠正这种情况。这些脚本在数据库中运行。

  1. 允许数据库接受旧式哈希运行

SET old_passwords=TRUE

  1. 使用新哈希设置新密码

SET old_passwords=FALSE

SET PASSWORD=PASSWORD('your_new_password_here')

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

【讨论】:

  • 是的。现在想象这是一个由其他人和连接使用的远程数据库。如果我无法重置用户密码,因为不知道可能对其他连接造成的影响?
  • 最后我们将现有用户克隆为一个新用户,并通过 SET PASSWORD 将其设置为新生成的密码。
  • 感谢详细的解释,很有用
猜你喜欢
  • 2013-03-24
  • 1970-01-01
  • 2016-06-06
  • 2013-04-18
  • 2014-06-25
  • 2020-08-17
  • 2015-12-17
  • 1970-01-01
相关资源
最近更新 更多