2

目前我正在开发连接到 MySQL 数据库以检索和存储数据的软件。软件本身运行正常,但我想实现一些新的安全功能。

这些安全功能之一是将数据库用户的密码存储为哈希而不是纯文本。为了记录,我不是使用表来验证用户,我说的是数据库用户连接到数据库本身。

我目前正在使用一个 MySQL 连接字符串,它以纯文本形式发送密码:

public abstract Database()
    {
        ReadConfig();
        connectionstring = "SERVER=" + server + ";" +
                "DATABASE=" + database + ";" +
                "UID=" + username + ";" +
                "PASSWORD=" + password + ";";
        try
        {
            connection = new MySqlConnection(connectionstring);
        }
        catch (MySqlException ex)
        {
            LogService.Log("ERROR - " + ex.ToString());
        }
    }

我还将这些数据存储在用户的计算机上,因此用户可以更改服务器地址、数据库、用户名和密码。正如我所说,这是以纯文本形式存储的。以纯文本形式存储的服务器地址、数据库名称和用户名对我来说很好,但我不想以纯文本形式存储密码。

生成 SHA1 散列(或其他散列方法)不是问题,因为我已经有了生成这些散列的方法。

简而言之,我想将密码保存为哈希,并在连接字符串中使用该哈希。我该如何实施?

编辑:我知道这是一个“通过默默无闻的安全”解决方案,它不是扩展我的软件安全性的最佳方式。我正在研究如何使用挑战-响应方法,但同时我想实现上述方法。

4

1 回答 1

2

您可以在这里做的最好的事情是加密用户的登录信息并在您想要登录时使用明文。MySQL 不会采用散列值 - 如果这样做,这不会比使用原始(未散列)值更安全。

一个“共享秘密”挑战是在您的服务器上使用代理来控制登录。当客户端想要连接时,服务器代理会发送一长串随机位。客户端会将(共享的)“秘密文本”附加到其末尾,在其上使用您的 SHA-1 哈希并将其发送回服务器。服务器将对文本执行相同的操作并比较字符串。这样,每次本质上都是一个不同的密码,并且嗅探它并不重要。

一旦客户端通过身份验证,服务器代理将启用与 mysql 进程的通信。使用 libmysql(或其 c#)等价物,您可以复制在“常规”mysql 客户端上发生的任何事情。

于 2012-09-28T10:47:44.277 回答