0

我正在为学校做一个应用程序,在将密码插入我的用户数据库时,我需要帮助加密密码。我正在用 c# 编程语言编程,我正在使用 MS server 2008 R2 来操作我的数据库。我正在考虑进行 HASH 加密,如果有人帮助我,我会很高兴。

这是我将数据插入数据库的代码:

using (SqlConnection con = new SqlConnection("Data Source=HRC0;Initial Catalog=users;Integrated Security=True")) //MLHIDE
        using (SqlCommand sc = new SqlCommand("if NOT exists (select * from users where UserName = @username) insert into users (userName, password) values(@userName, @password)", con)) 
        {
            con.Open();
            sc.Parameters.AddWithValue("@username", korisnik.Text); 
            sc.Parameters.AddWithValue("@password", pass.Text);   
            int o = sc.ExecuteNonQuery();
            if (o == -1)
            {
                MessageBox.Show(Ulaz.Properties.Resources.Niste_ubačeni_u_bazi_korisničk);
                this.Hide();
                new Registracija().Show();
            }
            else 
            {
                MessageBox.Show(Ulaz.Properties.Resources.Ubačeni_ste_u_bazi);
                con.Close();
                this.Hide();
                new Form1().Show();

             }

这是我的登录检查代码:

SqlConnection con = new SqlConnection("Data Source=HRC0;Initial Catalog=users;Integrated Security=True");
        SqlCommand cmd = new SqlCommand("select * from users where userName='" + user.Text + "' and password='" + pass.Text + "'", con); //MLHIDE
        con.Open();
        SqlDataReader re = cmd.ExecuteReader();

        if (re.Read())
        {
            ImeUsera = user.Text;
            new UserMode().Show();
            this.Hide();
        }
           else
            {
                this.Hide();
                new LoginFail().Show();
            }
        }

我使用了一些多语言插件,因此他将我的字符串转换为 ''Ulaz.Properties.Resources.'' 和类似的。

4

1 回答 1

1

要散列一串文本,您可以使用这样的函数

private string GetHashedText(string inputData)
{ 
    byte[] tmpSource;
    byte[] tmpData;
    tmpSource = ASCIIEncoding.ASCII.GetBytes(inputData);
    tmpData = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
    return Convert.ToBase64String(tmpData);
}

并应用于您的用户输入。然后将结果存储在数据库中。登录时,您将哈希函数重新应用于输入的密码,并根据存储的值检查结果。

所以在你的插入代码中你写

 sc.Parameters.AddWithValue("@password", GetHashedText(pass.Text));   

在你的支票上

 ....
 SqlCommand cmd = new SqlCommand("select * from users where userName=@user and password=@pass", con);
 con.Open();
 cmd.Parameters.AddWithValue("@user",user.Text);
 cmd.Parameters.AddWithValue("@pass", GetHashedText(pass.Text));
 SqlDataReader re = cmd.ExecuteReader();
 if (re.Read())
 .....

请记住,散列是不可逆的,因此您无法从散列文本中检索原始密码。您将 Hash 函数应用于您的文本并将其存储为 base64 字符串。如果您的用户忘记了密码,您需要将其重置为已知值。没有办法告诉他原来的密码。

顺便说一句,为什么在您的检查中不使用插入代码中的参数?永远不要使用字符串连接来构建 sql 查询。即使你急于完成工作

于 2013-06-05T17:08:34.563 回答