使用SHA1在Sql Server 2008上加密密码

本文关键字:加密 密码 2008 Server SHA1 Sql 使用 | 更新日期: 2023-09-27 18:25:53

我使用C#设计了一个登录系统,在加载主页之前,会在SQL server 2008中检查用户名和密码。我希望加密数据库中存储的密码。使用C#和SHA1算法可以做到这一点吗?

以下是我的存储过程:

ALTER procedure [dbo].[proc_UserLogin]
 @userid varchar(20),
  @password nvarchar(50)
  As 
  declare
  @ReturnVal              varchar(500)

SET NOCOUNT ON      
  if exists(select userid,password from LoginManager where userid=@userid and password=@password)
  set @ReturnVal='0|Logged in Successfully'
  else
  set @ReturnVal='1|Login Failed/Username does not exist'
  select @ReturnVal

C#代码

public void button1_Click(object sender, EventArgs e)
        {
            mainform = new Form1();
            string[] v;
            OleDbConnection conn = new OleDbConnection("File Name=E:''Vivek''License Manager''License Manager''login.udl");
            try
            {
                conn.Open();
                string query = "EXEC dbo.proc_UserLogin'" + username.Text+ "', '" + password.Text+"'";
                OleDbCommand cmd = new OleDbCommand(query, conn);
                string s = Convert.ToString(cmd.ExecuteScalar());
                v= s.Split('|');
                if (v[0]=="0")
                {
                    mainform.Show();
                    this.Hide();
                }
                else
                {
                    MessageBox.Show("Please enter correct user credentials and try again");
                }

             }
             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message);
             }

              conn.Close();
         }

我也遇到过其他用户提出的类似问题,但他们不适合我。有人能建议修改代码,以便完成密码加密吗?

感谢

使用SHA1在Sql Server 2008上加密密码

C#中的哈希和salt密码

https://crackstation.net/hashing-security.htm

https://www.bentasker.co.uk/blog/security/201-why-you-should-be-asking-how-your-passwords-are-stored

正如我在评论中所说,散列密码可能是你自己不应该做的事情。

需要注意的几点:

  • 不建议使用SHA1作为密码
  • 密码应该加盐
  • 你应该使用一个经过验证的用户商店框架,而不是试图创建自己的,因为你可能会"做错"
  • 我相信还有很多

也就是说,为了完成你的特定问题,你会想要这样的东西:

Users
----
userId
passwordHashed

passwordHashed存储用户密码的散列版本(纯文本密码永远不会存储在持久性中的任何位置。)

为了检查有效的密码,这样做:

ALTER procedure [dbo].[proc_UserLogin]
 @userid varchar(20),
  @password nvarchar(50)
  As 
  declare
  @ReturnVal              varchar(500)

SET NOCOUNT ON      
  if exists(select userid,password from LoginManager where userid=@userid and password=HASHBYTES('SHA1', @password))
  set @ReturnVal='0|Logged in Successfully'
  else
  set @ReturnVal='1|Login Failed/Username does not exist'
  select @ReturnVal

对于插入/更新用户密码,您需要确保存储哈希密码,而不是纯文本密码;

INSERT INTO users(userId, passwordHashed) 
VALUES (@userId, HASHBYTES('SHA1', @rawPassword)

UPDATE users 
SET passwordHased = HASHBYTES('SHA1', @rawPassword) 
WHERE userId = @userId

编辑:

刚刚意识到你在问如何用C#而不是SQL来完成散列。您可以执行以下操作(取自C#中的SHA1算法哈希):

public string Hash(byte [] temp)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(temp);
        return Convert.ToBase64String(hash);
    }
}

你的代码剪辑可能是:

            conn.Open();
            string query = "EXEC dbo.proc_UserLogin'" + username.Text+ "', '" + this.Hash(System.Text.Encoding.UTF8.GetBytes(password.Text))+"'";
            OleDbCommand cmd = new OleDbCommand(query, conn);

您还应该注意,您应该将参数参数化到存储过程中,而不是以您的方式传递它们——看起来您对此已经有了单独的问题。