https://crackstation.net/hashing-security.htm
Como dije en mis comentarios, el hash de contraseñas es algo que probablemente no deberías estar haciendo tú mismo.
Algunas cosas a tener en cuenta:
- SHA1 no se recomienda para contraseñas
- Las contraseñas deben ser saladas
- Debe utilizar un marco de almacenamiento de usuario verificado en lugar de intentar crear uno propio, ya que es probable que "lo haga mal"
- Seguro que hay muchos más
Dicho esto , para cumplir con su pregunta específica, le gustaría algo como esto:
Users
----
userId
passwordHashed
passwordHashed almacena una versión codificada de la contraseña del usuario (la contraseña de texto sin formato nunca se almacena en ningún lugar de manera persistente).
para verificar la contraseña válida se hace algo como esto:
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 insertar/actualizar contraseñas de usuario, debe asegurarse de almacenar la contraseña cifrada, no la contraseña de texto sin formato, como tal;
INSERT INTO users(userId, passwordHashed)
VALUES (@userId, HASHBYTES('SHA1', @rawPassword)
o
UPDATE users
SET passwordHased = HASHBYTES('SHA1', @rawPassword)
WHERE userId = @userId
EDITAR:
Me acabo de dar cuenta de que está preguntando cómo lograr el hash en C#, no en SQL. Puede realizar lo siguiente (tomado de Hashing con SHA1 Algoritmo en C# ):
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(temp);
return Convert.ToBase64String(hash);
}
}
Su fragmento de código podría 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);
También debe tener en cuenta que debe parametrizar sus parámetros a su procedimiento almacenado en lugar de pasarlos de la manera en que lo hace, lo que parece que ya tiene una pregunta separada al respecto.