当用户可以通过输入他们的信息登录程序时,我正在使用一个应用程序。密码以加密方式存储在表中。但是当我尝试使用这个密码登录时,它不起作用。
对于加密数据,我使用这个存储过程 ALTER procedure [dbo].[inn]
@use varchar (50) = null,
@ins varchar (50) = null
AS
INSERT INTO [kole].[dbo].[koll]
([Userr]
,[ins])
VALUES
(@use,
((EncryptByPassPhrase('8', @ins)))
对于解密,我使用这个存储过程
ALTER procedure [dbo].[sle]
@Use varchar (50) = null,
@ins varchar (50) = null
AS
SELECT Userr,CONVERT(varchar(50),DECRYPTBYPASSPHRASE ('8',ins)) as Password
FROM [kole].[dbo].[koll]
where Userr = @Use and ins = @ins
GO
在c#中,我使用这段代码来调用数据,并登录到程序中。
private void btn_Click(object sender, RoutedEventArgs e)
{
SqlConnection conn = new SqlConnection("Server = localhost;Database = kole; Integrated Security = true");
SqlCommand cmd = new SqlCommand("sle", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Userr", txt.Text);
cmd.Parameters.AddWithValue("@ins", psw.Password);
conn.Open();
SqlDataAdapter adapt = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapt.Fill(ds);
conn.Close();
int count = ds.Tables[0].Rows.Count;
if (count == 0)
{
MessageBox.Show("This user don't exist");
SystemSounds.Hand.Play();
txt.Text = "";
psw.Password = "";
}
else if (count == 1)
{
MessageBox.Show("Granted!");
SystemSounds.Asterisk.Play();
conn.Open();
}
如何正确解密密码,用于登录程序?由于
密码不应该加密保存,因为它们是可检索的。相反,它们应该被散列,加密散列是一个不能逆转的单向函数。在输入时对密码进行散列,并将散列后的值输入到DB中。在验证时,要验证的密码以与数据库中散列值相同的方式进行散列。
上面的"哈希"是指:用随机盐迭代HMAC大约100ms的持续时间(盐需要与哈希一起保存)。使用password_hash、PBKDF2、Bcrypt等函数和类似的函数。关键是要让攻击者花费大量时间通过暴力破解找到密码。
参见OWASP(开放Web应用程序安全项目)密码存储备忘单。
很简单,假设一个普通大众使用的应用程序,用户期望良好的安全性,你真的需要咨询安全领域的专家,不要等到攻击之后。
最后使用良好的双因素身份验证,并对所有服务器管理员保持良好的控制。
在你的[dbo]。[sle]存储过程,您需要
SET @ins = EncryptByPassPhrase('8', @ins)