Hash在插入数据库时​​加密密码

时间:2013-06-05 17:03:54

标签: c# hash sql-server-2008-r2 password-encryption

我正在申请学校,在将密码插入我的用户数据库时,我需要帮助加密密码。我使用c#编程语言进行编程,我正在使用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。''和simmilar。

1 个答案:

答案 0 :(得分: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())
 .....

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

顺便说一下,为什么在检查中你不像插入代码那样使用参数?永远不要使用字符串连接来构建SQL查询。即使你急着完成这份工作