如何从 SQL 服务器保护密码和散列?

How to secure password and hash from SQL Server?

我有一个 .NET WPF 应用程序。

我创建了两个帐户,其中一个名为“final”,将被定义。该帐户的密码将定义为“Fnl666”。另一个名为“admin”的帐户将在本系统中定义。

但是管理员账号密码必须保密(千万不要知道管理员密码)。即使是我的项目源代码,如果我查看它,我也不应该能够以明文形式找到该管理员帐户的密码。您需要提供如何解决这个问题?

我想到了使用密码非对称加密或者在Login的登录页面输入的hash会比较hash数据库值和密码进行比较

你有什么建议?

如何在 .NET 和 SQL 服务器的登录页面上隐藏管理员密码?

login page

homepage

secure password hash

database screenshot

这是我的哈希算法:

public static string hashPassword(string password)
{
        SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
        byte[] password_bytes = Encoding.ASCII.GetBytes(password);
        byte[] encrypted_bytes = sha1.ComputeHash(password_bytes);
        return Convert.ToBase64String(encrypted_bytes);
}

这是我的登录页面提交按钮点击

protected void btnLogin_Click(object sender, EventArgs e)
{
        try
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand("Select * from tbl_Login where @P1=userName and @P2=password", conn);

            cmd.Parameters.AddWithValue("@P1", TextBox1.Text);
            cmd.Parameters.AddWithValue("@P2", hashPassword(TextBox2.Text));

            SqlDataReader dr = cmd.ExecuteReader();

            if (dr.Read())
            {
                if (hashPassword(TextBox2.Text) == ??)
                {
                    Server.Transfer("loginSuccesful.aspx");
                    //Response.Redirect();
                }
            }
            else
            {
                Server.Transfer("errorPage.aspx");
            }
        }
        catch
        {
            Server.Transfer("errorPage.aspx");
        }
}

对于任何类型的应用程序,

加密:

  1. 您可以使用一些带有随机盐的强哈希算法(例如 BCrypt)对密码进行哈希处理。
  2. 然后使用 AES-256 等强大的加密算法和用户特定的密钥对散列密码进行加密。
  3. 通过这种方式,您可以强力隐藏任何人的密码。

解密:

  1. 您必须先用当前用户的密钥解密密码,然后您必须用相同的盐(可能将盐存储在数据库中)再次对用户输入的密码进行哈希处理,并与数据库检查相同的哈希密码,然后让他们进入应用程序。

始终加密: 如果您再次想要对 SQL 数据库进行一些保护,您可以在 SSMS 上使用 Always Encrypted 来加密表的敏感列。

我认为我的回答与您相关。