SQL Server – Implémentation alternative de PWDEncrypt et PWDCompare

Je modifie une application qui utilise les fonctions PWDEncrypt et PWDCompare de SQL Server pour stocker les passwords hachés dans une colonne varbinary d'une table.

Comme ces fonctions ne doivent pas être utilisées (en raison de changements possibles dans l'algorithm ou qu'elles deviendront obsolètes à l'avenir), je voudrais convertir l'application pour utiliser la fonction HASHBYTES prise en charge à la place.

Quelqu'un a-t-il le code pour implémenter la même fonctionnalité que PWDENCRYPT / PWDCOMPARE en utilisant la fonctionnalité HASHBYTES de sorte que je n'ai pas besoin que chaque user change son mot de passe pendant le changement et que les passwords hachés existants restnt valides?

J'utilise SQL Server 2008 R2.

J'ai réussi à produire ma propre implémentation de PWDENCRYPT et PWDCOMPARE en utilisant juste SQL.

Malheureusement, en raison de l'utilisation de RAND () dans la section PWDENCRYPT, vous ne pouvez pas convertir cela en UDF.

C'est le code qui exécute le PWDEncrypt

DECLARE @passwordToEncrypt NVARCHAR(MAX) SET @passwordToEncrypt = 'Password' DECLARE @salt VARBINARY(4) SET @salt = CONVERT(VARBINARY(4), RAND()) DECLARE @encryptedPassword VARBINARY(128) SET @encryptedPassword = 0x0100 + --Salt @salt + --Hash of Password + Salt HASHBYTES('SHA1', @passwordToEncrypt + CONVERT(NVARCHAR(MAX), @salt)) SELECT @passwordToEncrypt [OriginalPassword], @encryptedPassword [MyPWDEncrypt], PWDCOMPARE(@passwordToEncrypt, @encryptedPassword) [SQLPWDCompare] 

C'est le code qui exécute le PWDCompare

 DECLARE @passwordToTest NVARCHAR(MAX) SET @passwordToTest = 'Password' DECLARE @encryptedPassword VARBINARY(128) SET @encryptedPassword = PWDENCRYPT(@passwordToTest) SELECT @passwordToTest [OriginalPassword], @encryptedPassword [SQLPWDEncrypt], CASE WHEN @encryptedPassword = --Header 0x0100 + --Salt CONVERT(VARBINARY(4), SUBSTRING(CONVERT(NVARCHAR(MAX), @encryptedPassword), 2, 2)) + --Hash of Password + Salt HASHBYTES('SHA1', @passwordToTest + SUBSTRING(CONVERT(NVARCHAR(MAX), @encryptedPassword), 2, 2)) THEN 1 ELSE 0 END [MyPWDCompare]