https://crackstation.net/hashing-security.htm
https://www.bentasker.co.uk/blog/security/201-why-you-should-be-asking-how-your-passwords-are-stored
Comme je l'ai indiqué dans mes commentaires, le hachage des mots de passe est quelque chose que vous ne devriez probablement pas faire vous-même.
Quelques points à noter :
- SHA1 n'est pas recommandé pour les mots de passe
- Les mots de passe doivent être salés
- Vous devez utiliser un cadre de magasin d'utilisateurs vérifié plutôt que d'essayer de créer le vôtre, car vous "le ferez probablement mal"
- Je suis sûr qu'il y en a beaucoup d'autres
Cela étant dit , pour répondre à votre question spécifique, vous voudriez quelque chose comme ceci :
Users
----
userId
passwordHashed
passwordHashed stocke une version hachée du mot de passe de l'utilisateur (le mot de passe en texte brut n'est jamais stocké nulle part dans la persistance.)
pour vérifier un mot de passe valide, quelque chose comme ceci est fait :
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
Pour insérer/mettre à jour les mots de passe utilisateur, vous devez vous assurer de stocker le mot de passe haché et non le mot de passe en texte brut, en tant que tel ;
INSERT INTO users(userId, passwordHashed)
VALUES (@userId, HASHBYTES('SHA1', @rawPassword)
ou
UPDATE users
SET passwordHased = HASHBYTES('SHA1', @rawPassword)
WHERE userId = @userId
MODIFIER :
venez de réaliser que vous demandez comment accomplir le hachage en C #, pas en SQL. Vous pouvez effectuer ce qui suit (tiré de Hachage avec SHA1 Algorithme en C# ):
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(temp);
return Convert.ToBase64String(hash);
}
}
Votre extrait de code pourrait être :
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);
Vous devez également noter que vous devez paramétrer vos paramètres sur votre procédure stockée plutôt que de les transmettre comme vous le faites - ce qui semble être une question distincte à ce sujet.