Senhas de hash e salt em 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
Como afirmei em meus comentários, o hash de senhas é algo que você provavelmente não deveria fazer sozinho.
Algumas coisas a serem observadas:
- SHA1 não é recomendado para senhas
- As senhas devem ser salgadas
- Você deve usar uma estrutura de armazenamento de usuários verificada em vez de tentar criar a sua própria, pois provavelmente "fará errado"
- Tenho certeza de que há muito mais
Dito isso , para realizar sua pergunta específica, você desejaria algo assim:
Users
----
userId
passwordHashed
passwordHashed armazena uma versão com hash da senha do usuário (a senha de texto simples nunca é armazenada em nenhum lugar na persistência.)
para verificar a senha válida, algo assim é feito:
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 [email protected] and password=HASHBYTES('SHA1', @password))
set @ReturnVal='0|Logged in Successfully'
else
set @ReturnVal='1|Login Failed/Username does not exist'
select @ReturnVal
Para inserir/atualizar senhas de usuário, você precisa ter certeza de armazenar a senha com hash e não a senha de texto simples, como tal;
INSERT INTO users(userId, passwordHashed)
VALUES (@userId, HASHBYTES('SHA1', @rawPassword)
ou
UPDATE users
SET passwordHased = HASHBYTES('SHA1', @rawPassword)
WHERE userId = @userId
EDITAR:
acabei de perceber que você está perguntando como realizar o hash em C#, não em SQL. Você pode executar o seguinte (retirado de Hashing com SHA1 Algoritmo em C# ):
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(temp);
return Convert.ToBase64String(hash);
}
}
Seu recorte de código pode ser:
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);
Você também deve observar que deve parametrizar seus parâmetros para seu procedimento armazenado em vez de passá-los da maneira que você está - o que parece que você já tem uma pergunta separada em relação a isso.