通过 Visual Studio C# .NET 将哈希函数 Insertio 处理到 MySql 数据库中

Posted

技术标签:

【中文标题】通过 Visual Studio C# .NET 将哈希函数 Insertio 处理到 MySql 数据库中【英文标题】:Handling hash function Insertio into MySql Database via Visual Studio C# .NET 【发布时间】:2021-12-06 08:18:08 【问题描述】:

我正在为一家拥有酒店、餐厅和游泳池的大公司开发登录系统。 该公司内的每个员工都将有权访问/+监控系统数据库的凭据。

我了解以纯文本形式保存密码是一种BAD BAD 方法,因此我管理密码散列部分使用文本框和消息框(我稍后将其删除)对其进行了测试。并且由于几乎每个人(或我读过的帖子、视频和线程/表格)都说必须在HashedPassword 列旁边的数据库中拥有一个HashFunction 和一个Salt 列;我在将哈希函数值插入HashFunction 列时遇到了一些困难,因为我不知道保存它的值是什么!

这是我的代码

private mysqlConnection Connect()
    
        string con = "Server = servername; DataBase=DBName; username= usr; password=pwd ; Persist Security Info = False; Charset =utf8";
        MySqlConnection connection = new MySqlConnection(con);
        connection.Open();
        return connection;
    
    private String Salt(int size)
    
        var rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
        var buffsize = new byte[size];
        rng.GetBytes(buffsize);
        return Convert.ToBase64String(buffsize);
    

    private String GenerateSHA256Hash(string In, string salt)
    
        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(In + salt);
        SHA256Managed sha256hashstring = new SHA256Managed();
        byte[] hash = sha256hashstring.ComputeHash(bytes);
        return Convert.ToBase64String(hash);
    

    private void BtnAddUsr_Click(object sender, EventArgs e)
    
        string salt = Salt(10);
        string hashedpswd = GenerateSHA256Hash(text.Text, salt);
        string AddUser = "Insert into users(name,password,hashedpass,salt,position) VALUES ('" + txtu.Text + "','" + txtp.Text + "','" + hashedpswd.ToString() + "',";
    

我该如何处理这个问题,如果有人可以帮助我验证用户是否输入了正确的密码,那就太好了? 非常感谢。

【问题讨论】:

HashFunc 应该存储可以指示您对特定密码使用的散列算法的值。比如SHA-256、SHA-512等……你用这个值来决定用户登录时的哈希算法。 表中不需要密码列,因为您不会在其中存储纯文本密码 @Chetan 我的意思是密码列是散列的,这就是你看到散列函数的原因......现在你 你不需要表中的密码列,因为你不去要将纯文本密码存储在其中我想到了我需要删除 hashfunc 或密码列,尽管我仍然对验证密码感到困惑,我应该将GenerateSHA256Hash 方法的输出与存储的方法进行比较在数据库中? 是的,您需要根据用户名检查用户是否存在。如果是,则获取用户的盐并生成用户输入的密码的哈希值并将其与为用户存储在数据库中的散列密码。如果哈希匹配密码正确。 不要推出自己的身份验证系统。 【参考方案1】:

感谢@Chetan 我已经设法弄清楚我在哪里搞砸了BIG TIME!!!

除了command string 中的小改动之外,代码看起来几乎相同

    private void BtnAddUsr_Click(object sender, EventArgs e)
    
        try
         
            if (txtp.Text != "" && txtu.Text != "")
            
                MySqlConnection con = Connect();
                string salt = Salt(10);
                string hashedpswd = GenerateSHA256Hash(txtp.Text, salt);
                string AddUser = "Insert into users(name,hashedpass,salt,position) VALUES (@username,@hashedpassword,@salt,@poz)";
                MySqlCommand mySqlCommand = new MySqlCommand(AddUser, con);
                mySqlCommand.Parameters.AddWithValue("@uname", txtu.Text);
                mySqlCommand.Parameters.AddWithValue("@hashedpass", hashedpswd);
                mySqlCommand.Parameters.AddWithValue("@sugar", salt);
                mySqlCommand.Parameters.AddWithValue("@poz", CmbPositions.SelectedItem.ToString());


                //'" + txtu.Text + "','" + hashedpswd.ToString() + "', '"+hashvalue.ToString()+"', " +
                //"'" + salt.ToString() + "','" + CmbPositions.SelectedItem.ToString() + "'
                int res = mySqlCommand.ExecuteNonQuery();
                if (res == 1)
                
                    DialogResult dialog = MessageBox.Show("User Added Successfully,Would you like to sing-in?", "Proceed?", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                    if (dialog == DialogResult.Yes)
                    
                        new Thread(() => new Form1().ShowDialog()).Start();
                        this.SendToBack();
                    
                    else
                    
                        Application.Exit();
                    
                
            
         
         catch (MySqlException ex)
         
             if (txtp.Text == "" || txtu.Text == "")
             
                 MessageBox.Show(ex.Message.ToString(), "Error Adding User", MessageBoxButtons.OK, MessageBoxIcon.Error);
             
         
         finally
         
             Connect().Close();
         
    

【讨论】:

您应该查看一个 bcyrpt nuget 包,它将为您完成大部分工作,并帮助您避免一年后您发现六个月前被黑客入侵的那种错误。 @JoelCoehoorn,所以基本上 BlowFish 更好,更安全,在应用此算法时,它与 SHA256 和任何其他加密相同,对吧?

以上是关于通过 Visual Studio C# .NET 将哈希函数 Insertio 处理到 MySql 数据库中的主要内容,如果未能解决你的问题,请参考以下文章

通过 Visual Studio C# .NET 将哈希函数 Insertio 处理到 MySql 数据库中

C# C# 11 ( .Net 7.0)Visual Studio 2022

装了visual studio2008,怎么设置c#的系统环境变量

使用 c# 将 Visual Studio .net 2003 转换为 2008

我们可以在最初使用 C# 安装的 Visual Studio Express 中运行 VB.Net 吗?

ASP.NET 本地 SQL Server 数据库 C# gridview 数据绑定 Visual Studio 2013