我正在尝试使用MySQL在基于C#的WPF中实现logIn表单。贝娄是我的代码。当我尝试运行该程序时,一切似乎都很好,但当我尝试填写信息时,我收到错误就行了:
salt = cmd.ExecuteScalar() as string;
它表示:行上“字段列表”中的未知列“盐”。我试图做的是在我的表中创建列盐。首先,我没有输入数据并获得“错误的详细信息”,然后我插入了与我的密码相同的数据并得到相同的错误:“错误的详细信息”。你有什么机会知道如何解决我的问题?
以下是我的代码,其中替换了敏感数据:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.Security.Cryptography;
using System.Security.Authentication;
using System.Security.Permissions;
using System.Security.AccessControl;
using System.Security.Policy;
using System.Security.Principal;
using System.Security.Util;
namespace ECBSRecruitmentAgencySoftware
{
public partial class LogIn : Form
{
public LogIn()
{
InitializeComponent();
}
static byte[] GenerateSaltedHash(string plainText, string salt)
{
HashAlgorithm algorithm = new SHA256Managed();
byte[] plainTextBytes = System.Text.Encoding.Unicode.GetBytes(plainText);
byte[] saltBytes = Convert.FromBase64String(salt);
byte[] plainTextWithSaltBytes = new byte[plainTextBytes.Length + saltBytes.Length];
saltBytes.CopyTo(plainTextWithSaltBytes, 0);
plainTextBytes.CopyTo(plainTextWithSaltBytes, salt.Length);
byte[] hash = algorithm.ComputeHash(plainTextWithSaltBytes);
return hash;
}
public bool tryLogin(string username , string password)
{
using (var con = new MySqlConnection("host=tara.rdb.superhosting.bg;user=sozopouk;password=27051996;database=sozopouk_test2;"))
{
con.Open();
var salt = string.Empty;
using (var cmd = new MySqlCommand("Select salt From niki where user_name = @username", con))
{
cmd.Parameters.AddWithValue("@username", username);
salt = cmd.ExecuteScalar() as string;
}
if (string.IsNullOrEmpty(salt)) return false;
var hashedPassword = GenerateSaltedHash(password, salt);
using (var cmd = new MySqlCommand("Select * FROM niki WHERE user_name = @username and user_password = @password", con))
{
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@password", hashedPassword);
using (var reader = cmd.ExecuteReader())
{
return reader.Read();
}
}
}
}
private void button1_Click(object sender, EventArgs e)
{
if (tryLogin(user.Text, pass.Text) == true)
{
MainScreen F2 = new MainScreen();
F2.Show();
this.Hide();
}
else MessageBox.Show("Wrong details!");
}
}
}
答案 0 :(得分:0)
似乎表Niki没有字段名称为盐。
以下代码在salt
变量中返回NULL。
salt = cmd.ExecuteScalar() as string;
因此,在下一个语句中,您正在检查salt的空值或空值。
if (string.IsNullOrEmpty(salt)) return false;
如果salt为空或null,则从代码返回false。所以tryLogin
函数返回false,你会看到不需要的消息框“错误的细节!”。
您可以放置一个消息框,以显示从ExecuteScalar()
返回的盐的值以进行验证