SQL Server - PWDEncrypt和PWDCompare的替代实现

时间:2011-12-14 11:16:25

标签: sql-server hash passwords sql-server-2008-r2

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

由于不应使用这些函数(由于算法可能发生变化或将来不推荐使用),我想将应用程序转换为使用支持的HASHBYTES函数。

是否有人使用HASHBYTES功能实现与PWDENCRYPT / PWDCOMPARE相同的功能,这样我就不必让每个用户在转换过程中更改密码并且现有的散列密码仍然有效?

我使用的是SQL Server 2008 R2。

1 个答案:

答案 0 :(得分:4)

我已经设法使用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]