Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

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

Алгоритъмът за хеширане на пароли на 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 г.

  • Добре е хешът на паролата да е осотен.
  • Добре е да добавите солта на паролата, а не предварително то.

Но днес тя е остаряла. Той стартира хеша само веднъж, където трябва да го стартира няколко хиляди пъти, за да осуети атаките с груба сила.

Всъщност Baseline Security Analyzer на 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 премина към използване на SHA-2 512-битов:

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 0C0E8CC4C326220501147D6A0962FFC32FFC32FFC32FFC32FFC32FFC32FC20B6262F147D6A096262F147D6A0962620000000000000

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

  • SHA512(„правилна скоба за конска батерия“ +6A80BA22 )
  • SHA512(63006f0072007200650063007400200068006f007200730065002000620061007400740065007200797060007970600079706 + 6A80BA22 )
  • 9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B3FC1626B3FC26B3FC26B3FC26B3FC26B3FC26B3FC26B3FC26B3FC26B3FD2A006B3FC26B3FD2A006B3F32D2A006B3F262C000000000


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Избягване на блокиране на SQL с настройка на заявка:Съвети от Брент Озар

  2. Мисли за изданията на SQL Server 2019

  3. Как се прави GROUP BY, чувствителен към малки и големи букви?

  4. Разбиране на SQL Server ALTER TABLE ADD COLUMN Инструкция

  5. EXISTS срещу JOIN и използване на клауза EXISTS