c# - C# Mysql datareader - 如何使用datareader获取其他列
问题描述
我试图从我的数据库中验证已被散列和加盐的密码。我在我的用户表用户名、哈希和盐中创建了一个列。现在我想知道我可以使用 datareader 访问其他列的值。
我尝试了这种方法,但我得到了一条红线。这也是我失败的尝试
public static bool VerifyPassword(string enteredPassword, string storedHash, string storedSalt)
{
var saltBytes = Convert.FromBase64String(storedSalt);
var rfc2898DeriveBytes = new Rfc2898DeriveBytes(enteredPassword, saltBytes, 10000);
return Convert.ToBase64String(rfc2898DeriveBytes.GetBytes(256)) == storedHash;
}
private void bunifuFlatButton1_Click(object sender, EventArgs e)
{
string userhash;
string usersalt;
MySqlConnection mysqlCon = new MySqlConnection(connectionString);
MySqlCommand cmd = new MySqlCommand("SELECT * FROM login.info WHERE username = @user", mysqlCon);
MySqlDataReader rd;
rd = cmd.ExecuteReader();
cmd.Parameters.Add("@user", MySqlDbType.VarChar).Value = username.Text;
mysqlCon.Open();
while (rd.Read())
{
userhash = rd.GetString("hash");
usersalt = rd.GetString("salt");
bool isPasswordMatched = VerifyPassword(textpass.Text, userhash.Hash, usersalt.Salt);
// i got redline error in here. i only follow instruction.. link below
if (isPasswordMatched)
{
//Login Successfull
}
else
{
//Login Failed
}
}
}
顺便说一句,我只遵循这个线程的这个指令。如何在 C# 中验证加盐和散列密码
解决方案
这是编写代码的另一种方式,不是真正的答案,但是......不是完美的头脑,但至少它会处理对象并以正确的顺序调用它们。请阅读 IDisposable 和 Sql 注入。
private void bunifuFlatButton1_Click(object sender, EventArgs e)
{
using (MySqlConnection mysqlCon = new MySqlConnection(connectionString))
{
// Use a named list of fields please. And cleanse the text.
using (MySqlCommand cmd = new MySqlCommand("SELECT * FROM login.info WHERE username = @user", mysqlCon))
{
cmd.Parameters.Add("@user", MySqlDbType.VarChar).Value = username.Text; // Let's hope user name is not Jimmy DropTables!!
mysqlCon.Open();
using (MySqlDataReader rd = cmd.ExecuteReader())
{
while (rd.Read())
{
string userhash = rd.GetString("hash");
string usersalt = rd.GetString("salt");
bool isPasswordMatched = VerifyPassword(textpass.Text, userhash, usersalt);
// Note that we are passing in strings, not props of an unknown object
if (isPasswordMatched)
{
//Login Successfull
}
else
{
//Login Failed
}
}
}
mysqlCon.Close();
}
}
}
推荐阅读
- c++ - 为什么 vector::iterator 和 set::iterator 的工作方式不同?
- javascript - javascript中传播运算符的问题
- python - PyQt5 Linux Mint Cinnamon 原生“删除”、“应用”按钮
- python - Pandas 计算一列中的值,而另一列保持不变
- c# - C# 泛型类型推断
- excel - VBA 在表格底部插入行并直接从上方复制公式
- python - 如何从包含python中特定字母的大文本文件(> 60GB)中删除所有行?
- python - Maya Python - “您需要基于 shiboken 的类型”错误
- php - 如何从 mysql 表中输出带有正确逗号的 INT 值?
- angular - routerLinkActive 不适用于 router.navigateByUrl 或导航