Сравнение значений SQL Server PWDEncrypt


Я думаю, что то, что я собираюсь спросить, невозможно, однако, решил, что здесь стоит попробовать.

У нас есть приложение, которое использует функции SQL Server PWDEncrypt и PWDCompare.

Часть системы создает дубликаты пользователей (одинаковые логин и пароль). Из-за ошибки в системе, вместо копирования двоичного сохраненного PWDEncrypt пароля он выполнил другой PWDEncrypt пароля. Поэтому двоичные значения не совпадают.

Можно ли найти выходит, если два двоичных значения являются хэшами одного и того же пароля?

Например, PWDEncrypt ('abc') = PWDEncrypt ('abc')

Если я могу сделать это, то это означает, что я могу узнать, сколько пользователей эта ошибка на самом деле затронула, а не иметь дело с тысячами!

EDIT: чтобы уточнить, PWDEncrypt ('abc') = PWDEncrypt ('abc') не вернет true, поскольку пароли хэшируются в разные значения.

Хотя я знаю, что невозможно получить пароль из хэша, PWDCOMPARE ('abc', PWDENCRYPT ('abc')) работает, поэтому внутренне SQL Server должен делать больше, чем просто хэшировать пароль, который вы сравниваете, и проверять, что значения совпадают.

3 4

3 ответа:

Похоже , что утверждение Джоэла верно в SQL Server 2000, но не в SQL Server 2005.

Когда вы генерируете хэши вместе в одном и том же операторе в 2000 году, они заканчиваются одной и той же солью (случайное число семян в начале), что делает их идентичными. В 2005 году всегда генерируется другая соль, поэтому они никогда не совпадают

Если вы попробуете это на SQL Server 2000:

PRINT PWDEncrypt('abc')
PRINT PWDEncrypt('abc')
PRINT PWDEncrypt('aaa')
PRINT PWDEncrypt('bbb')

У вас всегда есть одна и та же соль в начале хэша, где, как в 2005 его всегда разный. Также обратите внимание, что в SQL Server 2005 хэш короче, так как он больше не поддерживает копию хэша в верхнем регистре для обеспечения совместимости паролей с учетом регистра.

Если вы можете генерировать хэш с той же солью, то вы можете сравнить их (что означает попытку грубой силы или атаки по словарю) посмотрите на эту статью о том, как это сделать. Он показывает, как взломать пароль SQL Server в C с помощью функции CryptCreateHash.

Просто попробуйте с помощью функции, которая реализует pwdencrypt('YourPa$$w0rd'), чтобы сохранить его, а затем другой, который возвращает бит 0/1 со встроенным fct pwdcompare ('The EnteredPassWord', (выберите Pwd из dbo.Пользователи, Где Uid = 'Имя Пользователя')) Вот и все ; -)

Вы можете просто ввести SELECT CASE WHEN PWDEncrypt('abc') = PWDEncrypt('abc') THEN 1 ELSE 0 END в окно запроса и посмотреть результат.