Мне удалось создать собственную реализацию PWDENCRYPT и PWDCOMPARE, используя только SQL.
К сожалению, из-за использования RAND () в разделе PWDENCRYPT вы не можете преобразовать это в UDF.
Это код, который выполняет 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]
Это код, который выполняет 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]