c# - 使用 SHA1 在 Sql Server 2008 上加密密码

标签 c# .net sql-server-2008 encryption sha

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

         }

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

谢谢

最佳答案

Hash and salt passwords in 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 作为密码
  • 密码应加盐
  • 您应该使用经过验证的用户存储框架,而不是尝试创建自己的用户存储框架,因为您可能会“做错”
  • 我确信还有更多

话虽这么说,为了完成您的具体问题,您需要这样的东西:

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。您可以执行以下操作(取自 Hashing with SHA1 Algorithm in C# ):

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

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

关于c# - 使用 SHA1 在 Sql Server 2008 上加密密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26256351/

相关文章:

sql - 如何从sql server中给定邮政编码和给定半径(以英里为单位)附近的表中获取所有其他邮政编码或(纬度和经度)?

c# - IQueryable GroupBy Lambda 表达式对于具有对象键的原始类型失败

c# - 从其子类初始化 C# Tuple<T, T> 以便在 WPF 中使用

c# - 使用 C# 将时间跨度值转换为格式 "hh:mm Am/Pm"

c# - 在构建了所有子类之后,如何在父类(super class)中执行一些代码?

SQL Server : how to query when the last transaction log backup has been taken?

c# - 在 C# 中比较两个 PDF 文件

c# - 如何从 LDAP 路径字符串中提取项目

c# - 在 C# 中,为什么从 List 创建 HashSet 比从 HashSet 开始更快?

sql - 为什么 SQL 事务内部的更新仍然需要磁盘 IO?