Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak odszyfrować hasło z serwera SQL?

Algorytm haszowania hasła serwera SQL:

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

Na przykład, aby zahaszować hasło „prawidłowe zszywki do baterii konia” . Najpierw generujemy losową sól:

fourByteSalt = 0x9A664D79;

A następnie zahaszuj hasło (zakodowane w UTF-16) wraz z solą:

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

Wartość przechowywana w syslogins tabela jest konkatenacją:

[nagłówek] + [sól] + [hasz]
0x0100 9A664D79 6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3

Co możesz zobaczyć w SQL Server:

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

name  PasswordHash
====  ======================================================
sa    0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
  • Nagłówek wersji:0100
  • Sól (cztery bajty):9A664D79
  • Hash:6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3 (SHA-1 to 20 bajtów; 160 bitów)

Weryfikacja

Potwierdzasz hasło, wykonując ten sam skrót:

  • wybierz sól z zapisanego PasswordHash :0x9A664D79

i ponownie wykonaj skrót:

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

który otrzyma ten sam hash i wiesz, że hasło jest poprawne.

Co kiedyś było dobre, ale teraz jest słabe

Algorytm haszujący wprowadzony w SQL Server 7 w 1999 roku był dobry na rok 1999.

  • Dobrze, że hash hasła jest solony.
  • Dobrze jest dołączyć sól do hasła, a nie poprzedzenie to.

Ale dziś jest przestarzały. Uruchamia hash tylko raz, ale powinien uruchomić go kilka tysięcy razy, aby udaremnić ataki siłowe.

W rzeczywistości Baseline Security Analyzer firmy Microsoft będzie, w ramach swoich kontroli, próbował wymusić na hasłach bruteforce. Jeśli odgadnie, zgłasza hasła jako słabe. I dostaje trochę.

Brutalne wymuszanie

Aby pomóc Ci przetestować niektóre hasła:

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 i SHA-512

Począwszy od SQL Server 2012, firma Microsoft przeszła na używanie SHA-2 512-bitowego:

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

Zmiana prefiksu wersji na 0x0200 :

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

name  PasswordHash
----  --------------------------------
xkcd  0x02006A80BA229556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
  • Wersja:0200 (SHA-2 256-bitowy)
  • Sól:6A80BA22
  • Hash (64 bajty):9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38

Oznacza to, że haszujemy hasło zakodowane w UTF-16 z sufiksem soli:

  • SHA512(„prawidłowa zszywka akumulatora konia” +6A80BA22 )
  • SHA512(63006f0072007200650063007400200068006f0072007300650020006200610074007400650072007900200073007400610070006c006500 + 6A80BA22 )
  • 9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tymczasowe buforowanie obiektów SQL Server

  2. Jak zainstalować SQL Server w SUSE 12?

  3. 3 sposoby na uzyskanie typu danych kolumny w SQL Server (T-SQL)

  4. Jak zmienić nazwę klucza JSON w SQL Server (T-SQL)

  5. Dostrajanie usług raportowania SQL Server