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

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

select pwdencrypt('AAAA')

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

0x0100CF465B7B12625EF019E157120D58DD46569AC7BF4118455D12625EF019E157120D58DD46569AC7BF4118455D

Как я могу преобразовать (расшифровать) вывод из его источника (который является «AAAA»)?

я погуглил "Как зашифровать пароль в SQL" и нашел этот пост !!!!!

AminM 12.07.2016 11:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
1
309 606
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

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

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

SELECT password_field FROM mytable WHERE password_field=pwdencrypt(userEnteredValue)

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

pwdencrypt () возвращает разные результаты после каждого вызова - вы не можете сравнить пароль, сравнивая два хэша, созданных с помощью pwdencrypt. Вместо этого вы должны использовать pwdcompare ('plaintext psw', 'hashed psw'), чтобы правильно сравнить их.

Anheledir 06.10.2008 12:46

Просто примечание, хеши необратимы, потому что возможно, что две разные строки могут равняться одному и тому же хешу. Таким образом, невозможно узнать, что это было изначально. Просто невероятно маловероятно встретить две строки, которые равны одному и тому же хешу, но это делает хеш более безопасным, поскольку не может его расшифровать.

Chewie The Chorkie 03.09.2015 23:05

Точнее, вы не можете расшифровать хэш, потому что хеш не содержит зашифрованных данных. Хеширование! = Шифрование. Хеширование - это операция с потерями, шифрование - нет.

Dan Bechard 23.08.2016 23:51

Что еще более важно, вы не можете отменить хеш, потому что хеширование - это операция с потерями. По замыслу отсутствует информация, поэтому хешированное значение не может быть использовано для воссоздания оригинала, имеется недостаточная информация. Единственная надежда на «обращение», предполагая, что кто-то знает хэш-алгоритм и соль, - это создать своего рода радужную таблицу для поиска исходных значений хеш-функции. -

G DeMasters 27.02.2021 02:12

Вы не можете снова расшифровать этот пароль, но есть другой метод под названием «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

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

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

Или по HASHBYTES('sha1', 'password').

Rabid 04.08.2010 16:24

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

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

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

Anheledir 06.10.2008 12:44

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

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

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

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

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

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

fourByteSalt = 0x9A664D79;

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

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

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

[header] + [salt] + [hash]
0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3

Что вы можете увидеть в 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

К вашему сведению, алгоритмы хеширования изменились в последних версиях SQL-сервера. См. hashcat.net/forum/thread-1474.html

Greg Bray 25.10.2013 03:28

Это UTF-16LE, если быть более точным (в противном случае PHP sha1(mb_convert_encoding("...", 'UTF-16')...) не работает)

Xenos 10.04.2017 18:50

Другие вопросы по теме