SQL Server - альтернативная реализация PWDEncrypt и PWDCompare - PullRequest
3 голосов
/ 14 декабря 2011

Я изменяю приложение, которое использует функции SQL Server PWDEncrypt и PWDCompare для хранения хешированных паролей в столбце таблицы varbinary.

Поскольку эти функции использовать не следует (из-за возможных изменений валгоритм или они устаревают в будущем) Я хотел бы преобразовать приложение для использования поддерживаемой функции HASHBYTES.

У кого-нибудь есть код для реализации той же функциональности, что и PWDENCRYPT / PWDCOMPARE, с использованием функциональности HASHBYTES,Мне не нужно заставлять каждого пользователя менять свой пароль во время перехода, а существующие хешированные пароли остаются действительными?

Я использую SQL Server 2008 R2.

1 Ответ

4 голосов
/ 14 декабря 2011

Мне удалось создать собственную реализацию 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...