Сравнение значений 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 ответа:
Похоже , что утверждение Джоэла верно в 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.