gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:03:08 24 4
gpt4 key购买 nike

我使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com