J'utilise ces requêtes ci-dessous pour valider un user.
Cette requête fonctionne parfaitement dans SQL Server et dans mon site Web Asp.Net.
SELECT * FROM AdminUsers WHERE username = 'admin' COLLATE SQL_Latin1_General_CP1_CS_AS AND Password = (SELECT HASHBYTES('SHA1', 'admin123'))
Cependant, quand je l'ai mis dans le code Asp.net / C # comme:
dbManager.Command.CommandText = @"SELECT * FROM AdminUsers WHERE username= @UserName COLLATE SQL_Latin1_General_CP1_CS_AS AND Password = (SELECT HASHBYTES('SHA1', @Password))"; dbManager.Command.Parameters.AddWithValue("@userName", username); dbManager.Command.Parameters.AddWithValue("@Password", password); reader = dbManager.GetDataReader(); if (reader.Read() == true) { //USER VALIDATED }
Cela ne correspond pas, donc pas sûr comment assigner le paramètre de mot de passe pour que cela fonctionne, juste pour confirmer que le mot de passe entré est correct. Et le type de données du Password
dans la table SQL Server est VarBinary
.
Aucune suggestion?
Le type de données de votre paramètre @Password
n'est pas correct.
Dans votre premier exemple, 'admin123' est une string varchar
ascii.
Dans votre code. @Password
est une string de caractères. Par défaut, il est défini sur nvarchar
string unicode. Ces hash à différentes valeurs, à savoir:
select hashbytes('SHA1', 'admin123') select hashbytes('SHA1', N'admin123')
résultats
0xF865B53623B121FD34EE5426C792E5C33AF8C227 0xB7BC3A1B04D9E165C6762B0A1CDE5226DF5B6A6A
Vous devez le définir sur un varchar
SqlDbType:
dbManager.Command.CommandText = @"SELECT * FROM AdminUsers WHERE username= @UserName COLLATE SQL_Latin1_General_CP1_CS_AS AND Password=(SELECT HASHBYTES('SHA1',@Password))"; dbManager.Command.Parameters.AddWithValue("@userName", username); dbManager.Command.Parameters.AddWithValue("@Password", password) .SqlDbType = SqlDbType.VarChar; reader = dbManager.GetDataReader(); if (reader.Read() == true) { //USER VALIDATED }
@userName
et @Password
sont tous les deux nvarchar
. HASHBYTES
est très sensible à varchar
vs nvarchar
; Dans votre exemple de travail, 'admin123'
est varchar
. Vous devrez spécifier explicitement ces parameters en tant que varchar
(en définissant .DbType = System.Data.DbType.AnsiSsortingng
), ou (de preference) utiliser nvarchar
(trop tard pour cela si hashed). Remarque: HASHBYTES
par lui-même n'est probablement pas un excellent choix pour la cryptography.