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

我使用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(); } 

我在这里遇到了其他用户提出的类似问题,但他们并没有为我工作。 任何人都可以建议更改代码,以便可以完成密码加密吗?

谢谢

C#中的哈希和盐密码

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用于密码
  • 密码应该是盐渍的
  • 您应该使用经过validation的用户界面而不是尝试创建自己的框架,因为您可能会“做错”
  • 我相信还有更多

话虽这么说 ,要完成你的具体问题,你会想要这样的事情:

 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); 

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