如何在C#中验证Windows应用程序的咸密码和用户名?

阿维什卡·丹巴温纳

我有一个简单的登录Windows应用程序。我已经在本地主机上成功创建了一个SQL数据库,其中包含用户名,密码(哈希),Salt和电子邮件等用户信息,并且还成功创建了一个用户注册表单,新用户可以在其中输入其详细信息,并将添加这些详细信息到数据库,它工作正常。

但是我无法根据包含要授予访问权限的数据库(localhost)中的用户数据的行中的存储值来验证用户名和密码。

我已经能够编写哈希,加盐和验证方法以备将来使用。

HashSalt.cs类

        // --- constructor to initialize num_of_iterations
        public HashSalt(int numOfIterations)
        {
            num_of_iterations = numOfIterations;
        }

        // --- Generate Salt ---
        public string  generateSalt()
        {
            var salt = new byte[32];

            var randomProvider = new RNGCryptoServiceProvider();
            randomProvider.GetBytes(salt);

            return Convert.ToBase64String(salt);        // returns salt as a string
        }

        // --- converts salt string into byte[]
        public byte[] saltToByte(string salt)
        {
            var byteSalt = Convert.FromBase64String(salt);
            return byteSalt;
        }

        // --- Generate hash of(pass+salt) ---
        public string generateHash(string password, byte[] salt)
        {

            var rfc2898 = new Rfc2898DeriveBytes(password, salt, num_of_iterations);

            var Password = rfc2898.GetBytes(32);    // gives 32 byte encoded password

            return Convert.ToBase64String(Password);    // returns hash
        }

        // --- Authenticate User ---
        public bool AuthenticateUser(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;
        }







    }
}

这是我的登录表单的Login.cs

private void btnSignin_Click(object sender, EventArgs e)
        {
            string enteredPass = txtLoginPassword.Text;

            DbHandler db = new DbHandler();
            MySqlDataAdapter adapter = new MySqlDataAdapter();
            DataTable table = new DataTable();
            MySqlCommand cmd = new MySqlCommand("SELECT password, salt FROM student WHERE indexno=@index;", db.getConnection());
            db.openConnection();    // open connection

                cmd.Parameters.Add("@index", MySqlDbType.VarChar).Value = txtLoginusername.Text;

                adapter.SelectCommand = cmd;
                adapter.Fill(table);

                if (table.Rows.Count > 0)
                {
                    string pass = table.Rows[0][0].ToString();
                    string salt = table.Rows[0][1].ToString();

                    string newPass = hashSalt.generateHash(enteredPass, hashSalt.saltToByte(salt));

                    if (hashSalt.authenticateUser(enteredPass, pass, salt))
                    {
                        // MessageBox.Show("correct ='" + pass + "'\nEntered pass ='" + hashSalt.authenticateUser(enteredPass, pass, salt) + "'");
                        // --- form Records obj
                        Records gotoRecords = new Records();
                        gotoRecords.Show(); // goto Records
                        this.Hide();

                }
                    else
                    {
                        string message = "User name & Password did not Match!?";
                        string title = "Attention!";
                        MessageBoxButtons buttons = MessageBoxButtons.OK;
                        DialogResult result = MessageBox.Show(message, title, buttons, MessageBoxIcon.Warning);
                    }

                }
                else
                {
                    string message = "User name NotFound!?";
                    string title = "Attention!";
                    MessageBoxButtons buttons = MessageBoxButtons.OK;
                    DialogResult result = MessageBox.Show(message, title, buttons, MessageBoxIcon.Warning);
                }
            //this.Close();
            db.openConnection();    // close connection

数据库结构 在此处输入图片说明如果您能给我一些指导,我将不胜感激。

Pinindu Chethiya

我认为问题出在mysql表中的salt列的数据类型上。这里,

string newPass = hashSalt.generateHash(enteredPass, hashSalt.saltToByte(salt));

您正在salt从数据库传递saltToByte()方法转换为byte array,所以我认为您打算使用generateSalt()method的返回值将盐存储为字符串在需要验证用户身份时将其转换为byte arrayusinggenerateHash()方法。

这是一个混乱的实现。建议您将盐储存为a,byte array这样就不需要使用了saltToByte()

除此之外,您的字节密钥在generateSalt()设置为

var salt = new byte[32];

32AuthenticateUser()字节密钥,并且您正在使用256字节密钥rfc2898DeriveBytes.GetBytes(256)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 .NET Core 控制台应用程序中安全地存储用户名和密码?

iOS:如何在应用程序中存储用户名/密码?

如何在 python 中的 Twisted 客户端服务器应用程序中添加身份验证(用户名/密码)?

C#我将如何向我的应用程序添加基本验证,以便在输入错误的用户名或密码时显示一个消息框

在 iOS 中卸载应用程序时如何从钥匙串中删除存储的用户名和密码?

如何在Mvc 4 Web API中接收json值(例如:从Android应用程序以json形式发送的用户名和密码)

如何通过用户名和密码保护在Docker容器中运行的Web应用程序?

如何使用简单成员资格在MVC 4应用程序中更改用户名和密码

如何设置NetBeans的Tomcat Manager应用程序用户名和密码?

如何在控制台中创建登录名,在其中使用存储在文件 c# 中的用户名和密码进行身份验证

在IIS Web应用程序中,如何获取Windows用户名?-不是进程用户名

如何在Moya中设置基本身份验证用户名和密码?

使用来自Java应用程序的用户名和密码身份验证发布推文

如何在tinyproxy中配置用户名和密码?

如何使用用户名和密码向Azure REST API进行身份验证(无应用程序ID)

如何在Maven中更改应用程序引擎的用户名/凭证?

如何在.NET Core控制台应用程序中获取MacOS用户名?

如何使用 Graph API 在 Windows 窗体应用程序中显示登录的用户名?

如何使我的Spring Boot应用程序使用给定的用户名和密码登录到keycloak?

如何使用Windows身份验证在IIS服务器上的Flask应用程序中获取当前用户的用户名?

如何在Spring Security身份验证登录中让用户输入用户名和密码的值

在 Python/Kivy 应用程序中保存用户名和密码

检查每个应用程序上的用户名和密码是否打开

asp.net mvc Web应用程序提示用户名和密码

Worklight应用程序中心中的默认用户名和密码

如何在Datasnap Server Methods单元中获取经过身份验证的用户名和密码?

如何在Laravel身份验证中处理列的自定义名称,用户名和密码

C#如何在应用程序中存储密码

React native如何验证用户名和密码