Как расшифровать пароль от SQL сервера?

У меня есть этот запрос в sql server 2000:

select pwdencrypt('AAAA')

который выводит зашифрованную строку AAAA:

0x0100CF465B7B12625EF019E157120D58DD46569AC7BF4118455D12625EF019E157120D58DD46569AC7BF4118455D

Как я могу преобразовать (расшифровать) вывод, исходя из исходного (AAAA)?


person sef    schedule 06.10.2008    source источник
comment
я погуглил Как зашифровать пароль в SQL и нашел этот пост !!!!!   -  person AminM    schedule 12.07.2016


Ответы (6)


Я считаю, что pwdencrypt использует хэш, поэтому вы не можете полностью изменить хешированную строку - алгоритм спроектирован так, что это невозможно.

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

Вот как вы можете проверить введенную пользователем таблицу

SELECT password_field FROM mytable WHERE password_field=pwdencrypt(userEnteredValue)

Замените userEnteredValue (большой сюрприз) значением, введенным пользователем :)

person Svet    schedule 06.10.2008
comment
pwdencrypt () возвращает разные результаты после каждого вызова - вы не можете сравнить пароль, сравнивая два хэша, созданных с помощью pwdencrypt. Вместо этого вы должны использовать pwdcompare ('plaintext psw', 'hashed psw'), чтобы правильно сравнить их. - person Anheledir; 06.10.2008
comment
Просто обратите внимание, хеши необратимы, потому что возможно, что две разные строки могут равняться одному и тому же хешу. Таким образом, невозможно узнать, что это было изначально. Просто невероятно маловероятно встретить две строки, которые равны одному и тому же хешу, но это делает хеш более безопасным, поскольку не может его расшифровать. - person Chewie The Chorkie; 03.09.2015
comment
Точнее, вы не можете расшифровать хеш, потому что хеш не содержит зашифрованных данных. Хеширование! = Шифрование. Хеширование - это операция с потерями, шифрование - нет. - person Dan Bechard; 23.08.2016
comment
Что еще более важно, вы не можете отменить хеш, потому что хеширование - это операция с потерями. По замыслу отсутствует информация, поэтому хешированное значение нельзя использовать для воссоздания оригинала, имеется недостаточная информация. Единственная надежда на обратное, при условии, что кто-то знает хэш-алгоритм и соль, - это сгенерировать своего рода радужную таблицу для поиска исходных значений хеш-функции. - - person G DeMasters; 27.02.2021

Алгоритм хеширования паролей SQL Server:

hashBytes = 0x0100 | fourByteSalt | SHA1(utf16EncodedPassword+fourByteSalt)

Например, для хеширования пароля «правильная скоба для конского аккумулятора». Сначала мы генерируем некоторую случайную соль:

fourByteSalt = 0x9A664D79;

А затем хешируйте пароль (закодированный в UTF-16) вместе с солью:

 SHA1("correct horse battery staple" + 0x9A66D79);
=SHA1(0x63006F007200720065006300740020006200610074007400650072007900200068006F00720073006500200073007400610070006C006500 0x9A66D79)
=0x6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3

Значение, хранящееся в таблице syslogins, представляет собой объединение:

[заголовок] + [соль] + [хеш]
0x0100 9A664D79 6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3

Что вы можете увидеть в SQL Server:

SELECT 
   name, CAST(password AS varbinary(max)) AS PasswordHash
FROM sys.syslogins
WHERE name = 'sa'

name  PasswordHash
====  ======================================================
sa    0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
  • Заголовок версии: 0100
  • Соль (четыре байта): 9A664D79
  • Хеш: 6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3 (SHA-1 составляет 20 байт; 160 бит)

Проверка

Вы подтверждаете пароль, выполняя тот же хеш:

  • взять соль из сохраненного PasswordHash: 0x9A664D79

и снова выполните хеш:

SHA1("correct horse battery staple" + 0x9A66D79);

который выйдет с тем же хешем, и вы знаете, что пароль правильный.

То, что когда-то было хорошо, а теперь слабое

Алгоритм хеширования, представленный в SQL Server 7 в 1999 году, годился для 1999 года.

  • Хорошо, что посолил хеш пароля.
  • Лучше добавить соль к паролю, а не добавлять его.

Но сегодня это устарело. Он запускает хэш только один раз, тогда как он должен запускать его несколько тысяч раз, чтобы предотвратить атаки грубой силы.

Фактически, в рамках проверок базовый анализатор безопасности Microsoft будет пытаться подобрать пароли. Если он догадывается, он сообщает пароли как ненадежные. И это действительно получается.

Грубое форсирование

Чтобы помочь вам проверить пароли:

DECLARE @hash varbinary(max)
SET @hash = 0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
--Header: 0x0100
--Salt:   0x9A664D79
--Hash:   0x6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3

DECLARE @password nvarchar(max)
SET @password = 'password'

SELECT
    @password AS CandidatePassword,
    @hash AS PasswordHash,

    --Header
    0x0100
    +
    --Salt
    CONVERT(VARBINARY(4), SUBSTRING(CONVERT(NVARCHAR(MAX), @hash), 2, 2))
    +
    --SHA1 of Password + Salt
    HASHBYTES('SHA1', @password + SUBSTRING(CONVERT(NVARCHAR(MAX), @hash), 2, 2))

SQL Server 2012 и SHA-512

Начиная с SQL Server 2012, Microsoft перешла на использование 512-битного алгоритма SHA-2:

hashBytes = 0x0200 | fourByteSalt | SHA512(utf16EncodedPassword+fourByteSalt)

Изменение префикса версии на 0x0200:

SELECT 
   name, CAST(password AS varbinary(max)) AS PasswordHash
FROM sys.syslogins

name  PasswordHash
----  --------------------------------
xkcd  0x02006A80BA229556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
  • Версия: 0200 (SHA-2 256-бит)
  • Соль: 6A80BA22
  • Хеш (64 байта): 9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38

Это означает, что мы хэшируем пароль в кодировке UTF-16 с суффиксом соли:

  • SHA512 ("правильная скоба для лошадиных аккумуляторов" + 6A80BA22)
  • SHA512 (63006f0072007200650063007400200068006f0072007300650020006200610074007400650072007900200073007400610070006c006500 + 6A80BA22)
  • 9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
person Ian Boyd    schedule 09.08.2013
comment
К вашему сведению, алгоритмы хеширования изменились в последних версиях SQL-сервера. См. hashcat.net/forum/thread-1474.html. - person Greg Bray; 25.10.2013
comment
Это UTF-16LE, если быть более точным (в противном случае sha1(mb_convert_encoding("...", 'UTF-16')...) PHP не работает) - person Xenos; 10.04.2017

Вы понимаете, что можете делать стержень для своей спины на будущее. Функции pwdencrypt () и pwdcompare () являются недокументированными функциями и могут не работать так же в будущих версиях SQL Server.

Почему бы не хешировать пароль с помощью предсказуемого алгоритма, такого как SHA-2 или лучше, перед обращением к БД?

person Kev    schedule 06.10.2008

На самом деле вам не следует расшифровывать пароли.

Вы должны зашифровать пароль, введенный в ваше приложение, и сравнить его с зашифрованным паролем из базы данных.

Изменить - и если это из-за того, что пароль был забыт, настройте механизм для создания нового пароля.

person Dynite    schedule 06.10.2008

Вы не можете снова расшифровать этот пароль, но есть другой метод под названием «pwdcompare». Вот пример того, как использовать его с синтаксисом SQL:

USE TEMPDB
GO
declare @hash varbinary (255)
CREATE TABLE tempdb..h (id_num int, hash varbinary (255))
SET @hash = pwdencrypt('123') -- encryption
INSERT INTO tempdb..h (id_num,hash) VALUES (1,@hash)
SET @hash = pwdencrypt('123')
INSERT INTO tempdb..h (id_num,hash) VALUES (2,@hash)
SELECT TOP 1 @hash = hash FROM tempdb..h WHERE id_num = 2
SELECT pwdcompare ('123', @hash) AS [Success of check] -- Comparison
SELECT * FROM tempdb..h
INSERT INTO tempdb..h (id_num,hash) 
VALUES (3,CONVERT(varbinary (255),
0x01002D60BA07FE612C8DE537DF3BFCFA49CD9968324481C1A8A8FE612C8DE537DF3BFCFA49CD9968324481C1A8A8))
SELECT TOP 1 @hash = hash FROM tempdb..h WHERE id_num = 3
SELECT pwdcompare ('123', @hash) AS [Success of check] -- Comparison
SELECT * FROM tempdb..h
DROP TABLE tempdb..h
GO
person Anheledir    schedule 06.10.2008

Быстрый google указывает, что pwdencrypt () не является детерминированным, и ваш оператор select pwdencrypt ( 'AAAA') возвращает другое значение в моей установке!

См. Также эту статью http://www.theregister.co.uk/2002/07/08/cracking_ms_sql_server_passwords/

person devio    schedule 06.10.2008
comment
Метод pwdencrypt () возвращает разные хеши для каждого вызова - в любом случае метод pwdcompare () может сравнивать два хеша. - person Anheledir; 06.10.2008