Обратное проектирование соленой логики паролей SHA1 в SQL

#sql #sql-server #cryptography #passwords #password-encryption

#sql #sql-сервер #криптография #пароли #пароль-шифрование

Вопрос:

Недавно я стал администратором приложения для собственного приложения, разработанного без документации и поддержки.

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

Я не могу написать код SQL, чтобы имитировать поведение приложений, использующих SHA1 для хэширования пароля и соли, и хотел бы получить некоторую помощь.

Я настроил приведенный ниже пример того, что я пробовал до сих пор, чтобы любой мог скопировать / вставить и поиграть.

Тестовый пароль: Password1234!
Соль (хранится в базе данных SQL): PvEdk1itxYINUl1m6tMSBQ ==
Пароль (хранится в базе данных SQL): K9VK3nis2lKMjGvgkuTogK /3Nac =

Ниже вы найдете SQL, который я использую для проверки концепции.

     DECLARE @Password varchar(100) = 'Password1234!'
    DECLARE @PasswordHex varbinary(max) = CONVERT(varbinary(max), @Password)
    DECLARE @Salt varchar(100) = 'PvEdk1itxYINUl1m6tMSBQ=='
    DECLARE @SaltHex varbinary(max)
    DECLARE @PasswordSaltHex varbinary(max)
    DECLARE @HashedPassHex varbinary(max)
    DECLARE @HashedPass varchar(max)
    --
    SET @SaltHex = cast('' as xml).value('xs:base64Binary(sql:variable("@Salt"))', 'varbinary(max)')
    SET @PasswordSaltHex = @PasswordHex   @SaltHex
    SET @HashedPassHex = HASHBYTES('SHA1',@PasswordSaltHex)
    SET @HashedPass = cast('' as xml).value('xs:base64Binary(sql:variable("@HashedPassHex"))', 'varchar(max)')
    --
    PRINT @Password -- OUTPUT: Password1234!
    PRINT @PasswordHex -- OUTPUT: 0x50617373776F72643132333421
    PRINT @Salt -- OUTPUT: PvEdk1itxYINUl1m6tMSBQ==
    PRINT @SaltHex -- OUTPUT: 0x3EF11D9358ADC5820D525D66EAD31205
    PRINT @PasswordSaltHex -- OUTPUT: 0x50617373776F726431323334213EF11D9358ADC5820D525D66EAD31205
    PRINT @HashedPassHex -- OUTPUT: 0x727B312D682FA8766E6A498B0AF923FFDAF3778F
    PRINT @HashedPass -- OUTPUT: cnsxLWgvqHZuakmLCvkj/9rzd48=
 

Я ожидал бы, что выходные данные @HashedPass будут такими же, как пароль, хранящийся в базе данных, показанной выше, но они не совпадают.

Для этого используется SQL Server 2017, и у меня есть относительная уверенность в том, что используемый алгоритм хеширования является SHA1.

Есть ли у кого-нибудь рекомендации относительно того, что я могу сделать или попытаться решить мою проблему?

Комментарии:

1. Для справки, я уже работал с ребятами на сайте Cryptography Stack Exchange, и они направили меня сюда. crypto.stackexchange.com/questions/68684 /…

2. Как мы можем помочь? Конечно, вы только что доказали, что используемый алгоритм не является SHA1? В противном случае у вас было бы совпадение?

3. Хотя в приведенном выше коде вы делаете намного больше, чем просто SHA1. Я думаю, вы обнаружите, что самым простым подходом было бы разработать новый метод и заставить все изменить свой пароль.

4. У меня нет автономии, чтобы что-либо менять. У меня нет доступа к изменению кода приложения, и я не знал бы, что с ним делать, если бы я это сделал. Похоже, что когда пользователь входит в систему, приложение преобразует пароль в шестнадцатеричный, добавляет соль (хранящуюся в шестнадцатеричном формате в БД) в конец пароля и хеширует его. Предполагая, что это то, что делает приложение, будет ли мой код SQL выше делать то же самое?

5. Но вы добавили на этапе преобразования его в base64? Но в любом случае, не видя никакого фактического кода, как кто-нибудь еще может внести полезные предложения? Вам просто нужно продолжать играть, пока не получите совпадение…