Сравнение значений PWDEncrypt в SQL Server - PullRequest
4 голосов
/ 24 апреля 2009

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

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

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

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

например. PWDEncrypt ('abc') = PWDEncrypt ('abc')

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

РЕДАКТИРОВАТЬ: Чтобы уточнить, PWDEncrypt ('abc') = PWDEncrypt ('abc') НЕ вернет истину, так как пароли хэшируются на разные значения.

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

Ответы [ 3 ]

2 голосов
/ 25 апреля 2009

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

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

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

PRINT PWDEncrypt('abc') <br>PRINT PWDEncrypt('abc') <br>PRINT PWDEncrypt('aaa') <br>PRINT PWDEncrypt('bbb')

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

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

1 голос
/ 22 ноября 2011

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

0 голосов
/ 24 апреля 2009

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

...