sql >> Databáze >  >> RDS >> Sqlserver

Jak dešifrovat heslo ze serveru SQL?

Algoritmus hašování hesla serveru SQL:

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

Chcete-li například zahašovat heslo "správná svorka koňské baterie" . Nejprve vygenerujeme nějakou náhodnou sůl:

fourByteSalt = 0x9A664D79;

A pak heslo (zakódované v UTF-16) hashujte spolu se solí:

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

Hodnota uložená v syslogins tabulka je zřetězení:

[hlavička] + [sůl] + [hash]
0x0100 9A664D79 6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3

Což můžete vidět na SQL Server:

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

name  PasswordHash
====  ======================================================
sa    0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
  • Záhlaví verze:0100
  • Sůl (čtyři bajty):9A664D79
  • Hash:6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3 (SHA-1 je 20 bajtů; 160 bitů)

Ověření

Heslo ověříte provedením stejného hash:

  • vezměte sůl z uloženého PasswordHash :0x9A664D79

a proveďte hash znovu:

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

který vyjde na stejný hash a vy víte, že heslo je správné.

Co bylo kdysi dobré, ale nyní je slabé

Hašovací algoritmus představený s SQL Server 7 v roce 1999 byl dobrý pro rok 1999.

  • Je dobře, že heslo hash salted.
  • Je dobré připojit sůl k heslu, nikoli předřazení to.

Ale dnes je to zastaralé. Spustí hash pouze jednou, kde by ho měl spustit několik tisíckrát, aby zabránil útokům hrubou silou.

Ve skutečnosti se Baseline Security Analyzer společnosti Microsoft v rámci svých kontrol pokusí brutálně vynutit hesla. Pokud nějaké uhodne, hlásí hesla jako slabá. A nějaké to dostává.

Hrubé vynucování

Abychom vám pomohli otestovat některá hesla:

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

Počínaje SQL Server 2012 přešel Microsoft na používání SHA-2 512-bit:

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

Změna předpony verze na 0x0200 :

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

name  PasswordHash
----  --------------------------------
xkcd  0x02006A80BA229556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
  • Verze:0200 (256bitový SHA-2)
  • Sůl:6A80BA22
  • Hash (64 bajtů):9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D630501147D6A038ABD23A13038ABD92A1A038ABD29

To znamená, že heslo zakódované v UTF-16 hašujeme s příponou salt:

  • SHA512("správná svorka koňské baterie" +6A80BA22 )
  • SHA512(63006f0072007200650063007400200068006f007200730065002000620061007400740065007200779300206006070770602006 + 6A80BA22 )
  • 9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A0069FC82A006F213D9


  1. Jak COALESCE() funguje v MariaDB

  2. Porovnejte data v T-SQL, ignorujte časovou část

  3. MySql získává záznamy nebo data denně, týdně, měsíčně a ročně

  4. Jaký je nejrychlejší způsob výpočtu mediánu?