如何从 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");
}
}
对于任何类型的应用程序,
加密:
- 您可以使用一些带有随机盐的强哈希算法(例如 BCrypt)对密码进行哈希处理。
- 然后使用 AES-256 等强大的加密算法和用户特定的密钥对散列密码进行加密。
- 通过这种方式,您可以强力隐藏任何人的密码。
解密:
- 您必须先用当前用户的密钥解密密码,然后您必须用相同的盐(可能将盐存储在数据库中)再次对用户输入的密码进行哈希处理,并与数据库检查相同的哈希密码,然后让他们进入应用程序。
始终加密:
如果您再次想要对 SQL 数据库进行一些保护,您可以在 SSMS 上使用 Always Encrypted 来加密表的敏感列。
我认为我的回答与您相关。
我有一个 .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");
}
}
对于任何类型的应用程序,
加密:
- 您可以使用一些带有随机盐的强哈希算法(例如 BCrypt)对密码进行哈希处理。
- 然后使用 AES-256 等强大的加密算法和用户特定的密钥对散列密码进行加密。
- 通过这种方式,您可以强力隐藏任何人的密码。
解密:
- 您必须先用当前用户的密钥解密密码,然后您必须用相同的盐(可能将盐存储在数据库中)再次对用户输入的密码进行哈希处理,并与数据库检查相同的哈希密码,然后让他们进入应用程序。
始终加密: 如果您再次想要对 SQL 数据库进行一些保护,您可以在 SSMS 上使用 Always Encrypted 来加密表的敏感列。
我认为我的回答与您相关。