我使用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();
}
我在这里遇到了其他用户提出的类似问题,但他们并没有为我工作。任何人都可以建议更改代码,以便可以完成密码加密吗?
由于
答案 0 :(得分:3)
https://crackstation.net/hashing-security.htm
https://www.bentasker.co.uk/blog/security/201-why-you-should-be-asking-how-your-passwords-are-stored
正如我在评论中所述,哈希密码是您可能不应该自己做的事情。
有几点需要注意:
那就是说,为了完成你的具体问题,你会想要这样的东西:
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);
您还应该注意,您应该将参数参数化到存储过程,而不是以您的方式传递它们 - 看起来您已经有一个单独的问题。