SQL Server: как получить действительное значение пароля, зашифрованного с использованием хэш-байт
insert into Customer(AccountNo,Name,EmailId,MobileNo,[Password],Balance,
CustomerKey,OTPPin,CreatedBy,CreatedOn)
values(@AccountNumber,@Name,@EmailId,
EncryptByPassPhrase(@PassPhrase, CONVERT(nvarchar,@MobileNo)),
HASHBYTES('SHA1',@Password),@TotalBalance,@CustomerKey,@OTPPin,0,GETDATE())
Я получаю вставленное значение в этой форме
Теперь я хочу фактическое значение пароля. Как я могу получить это?
2 ответа
Так как вы использовали HASHBYTES('SHA1'
на свой пароль - вы не можете просто вернуть его первоначальное значение.
SHA1 - односторонняя хеш-функция.
На самом деле, вам не нужно это первоначальное значение в большинстве случаев. Типичное использование скрытых паролей состоит не в том, чтобы каким-то образом получить исходное значение из хэша и сравнить его с паролем, введенным пользователем, а вместо этого применить хеш-функцию к паролю, введенному пользователем, а затем сравнить два значения хеш-функции.
НЕ ИСПОЛЬЗУЙТЕ ОДИН КРУГЛЫЙ ХЕШИНГ ДЛЯ ХРАНЕНИЯ ПАРОЛЕЙ
НЕ ИСПОЛЬЗУЙТЕ СОЛНЕЧНЫЕ ХАШИ ДЛЯ ХРАНЕНИЯ ПАРОЛЕЙ
НЕ ИСПОЛЬЗУЙТЕ SHA1 ДЛЯ ХРАНЕНИЯ ПАРОЛЕЙ
Прочтите канонический ответ Томаса Порнина "Как надежно хэшировать пароли" прямо сейчас.
Теперь выберите PBKDF2, BCrypt или SCrypt.
Правила хеширования
Делайте хэширование там, где вы его контролируете - в Интернете это приложение на стороне сервера (будь то PHP, ASP.NET и т. Д.).
- НЕ в SQL, если это вообще возможно - ваш сервер приложений будет намного быстрее, имеет тенденцию быть гораздо более масштабируемым, и вам нужно большое количество итераций, которое ДОЛЖНО быть настолько высоким, чтобы использовать большую часть ЦП сервера приложений под вашим пиковым числом логинов в секунду - помните, 8 ядер могут запускать 8 хешей одновременно, 8 ядер могут запускать 1 хеш.
Надежно зашифруйте соединение между сервером приложений и сервером SQL.
Многие из основ можно найти в статье MSDN Включить зашифрованные подключения к компоненту базы данных (диспетчер конфигурации SQL Server)
ПРИМЕЧАНИЕ. - после импорта сертификата необходимо щелкнуть его правой кнопкой мыши, перейти ко всем задачам, управлять закрытыми ключами, а затем добавить разрешение на чтение (и только чтение) для учетной записи службы SQL Server и учетной записи службы агента SQL Server.
Если вам абсолютно необходимо хешировать в SQL Server, у меня в репозитории Github есть код T-SQL PBKDF2 с лицензией общего доступа, включая несколько оптимизаций и набор тестовых векторов.
- И пусть ваши разработчики приложений исправят приложение.
Вот некоторая информация о том, как хранить PBKDF2 (или BCrypt, или SCrypt) в базе данных, если это также поможет.
Чтобы сравнить пароль с хешированным паролем в целом
После того, как вы исправите свое хранилище паролей, правильный способ проверки пароля пользователя
- Получить из базы данных хешированный пароль, соль и количество итераций / коэффициент работы
- Хэшируйте все, что пользователь ввел в качестве возможного пароля, используя только что извлеченные соль и число итераций / коэффициент работы
- Если новый хеш такой же, как и предыдущий, пароль был тем же.
Чтобы получить действительное значение паролей из хеша:
Если вы действительно хотите получить действительное значение пароля, которое НЕ СЛЕДУЕТ, за исключением слабого аудита паролей, используйте oclHashcat или, если вы не можете использовать oclHashcat, попробуйте John the Ripper.
Это позволит выполнять как марковские, так и маскирующие атаки (расширенные атаки методом "грубой силы"), а также статистические атаки и атаки по словарю на основе правил для создания миллиардов паролей в секунду против одного раунда SHA1 или с 8 современными графическими процессорами на ранней стадии. 2016
Это 9.7E16 (2^56) одиночная итерация SHA1 угадывает каждые 30 дней
- и против несоленого хэша, он может сделать это много против каждого пароля в базе данных одновременно.