我正在修改一个使用SQL Server的PWDEncrypt和PWDCompare函数的应用程序,以将散列密码存储到表的varbinary列中。

由于不应该使用这些函数(由于算法可能会更改,或者将来会弃用),因此我希望将应用程序转换为使用受支持的HASHBYTES函数。

是否有人使用HASHBYTES功能实现与PWDENCRYPT / PWDCOMPARE相同的功能的代码,这样我不必在转换期间不必让每个用户都更改其密码并且现有的哈希密码仍然有效?

我正在使用SQL Server 2008 R2。

最佳答案

我已经设法仅使用SQL产生了自己的PWDENCRYPT和PWDCOMPARE实现。

不幸的是,由于在PWDENCRYPT部分中使用了RAND(),因此您不能将其转换为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]

09-27 16:24