目前我正在研究连接到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哈希(或其他哈希方法)不是问题,因为我已经有了生成这些哈希的方法。
简而言之,我想将密码保存为哈希,并在de连接字符串中使用该哈希。我该如何实现呢?
编辑: 我知道这是一个“通过默默无闻的安全”解决方案,它不是扩展我的软件安全性的最佳方式。我正在研究如何使用质询 - 响应方法,但同时我想实现上述方法。
答案 0 :(得分:1)
您可以在这里做的最好的事情是加密用户的登录信息,并在您想要登录时使用明文。 MySQL不会采用散列值 - 如果确实如此,这将比使用原始(未散列)值更安全。
“共享秘密”挑战是在您的服务器上使用代理来控制登录。当客户端想要连接时,服务器代理将发送一长串随机位。客户端会将(共享)“秘密文本”附加到此末尾,在其上使用SHA-1哈希并将其发送回服务器。服务器将对文本执行相同操作并比较字符串。这样每次它本质上都是一个不同的密码,并且嗅探它并不重要。
对客户端进行身份验证后,服务器代理将启用与mysql进程的通信。使用libmysql(或其c#)等价物,你可以复制在'常规'mysql客户端上发生的任何事情。