J'utilise le hachage côté serveur pour transmettre les mots de passe, puis j'exécute PBKDF2 dans la base de données pour stocker la combinaison mot de passe haché + sel.
Le hachage nvarchar(max)
et un @variable
Contenant la même valeur ont donné des résultats différents avec la fonction HASHBYTES()
.
DECLARE @hash NVARCHAR(MAX) = 'password5baa61e4c9b93f3f0682250b6'
SELECT HASHBYTES('SHA1', 'password5baa61e4c9b93f3f0682250b6') AS NVARCHAR_INPUT,
HASHBYTES('SHA1', @hash) AS VARIABLE_INPUT
Donne ce qui suit:
NVARCHAR_INPUT | VARIABLE_INPUT
0xA03BEF0E3EC96CC7C413C6646D3FEC6174DA530F | 0x74B55C42E1E0AB5C5CDF10B28567590B240355C3
Il s'agit de SQL Server 2012. Cette base de données particulière exécute SQL Server Express, donc je suis également curieux de savoir si cette question est indépendante de la version.
Si vous voulez qu'une chaîne entre guillemets soit NVARCHAR
(traitée comme Unicode), vous devez la préfixer avec N.
DECLARE @hash NVARCHAR(MAX) = 'password5baa61e4c9b93f3f0682250b6'
SELECT HASHBYTES('SHA1', N'password5baa61e4c9b93f3f0682250b6') AS NVARCHAR_INPUT,
HASHBYTES('SHA1', @hash) AS VARIABLE_INPUT
Cela montrera les hachages correspondants.
NVARCHAR_INPUT |VARIABLE_INPUT
0xCF01AF0DCECF41BA0106A264666544C2590A4660 |0xCF01AF0DCECF41BA0106A264666544C2590A4660
Le préfixe n'est pas nécessaire ici car il est déclaré comme NVARCHAR
et la chaîne sera convertie.
DECLARE @hash NVARCHAR(MAX) = 'password5baa61e4c9b93f3f0682250b6'
Bien que j'aie rencontré des problèmes avec cela, je vais généralement préciser:
DECLARE @hash NVARCHAR(MAX) = N'password5baa61e4c9b93f3f0682250b6'
Si vous voulez une explication de la raison pour laquelle ils peuvent être hachés différemment, commencez par cet exemple:
DECLARE @n NVARCHAR(1) = N'N'
DECLARE @v VARCHAR(1) = 'N'
SELECT DATALENGTH(@n), DATALENGTH(@v)