sql >> Database >  >> RDS >> Sqlserver

Hoe een wachtwoord van een SQL-server te decoderen?

Het hash-algoritme van het SQL Server-wachtwoord:

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

Om bijvoorbeeld het wachtwoord "correct horse battery staple" . te hashen . Eerst genereren we wat willekeurig zout:

fourByteSalt = 0x9A664D79;

En hash vervolgens het wachtwoord (gecodeerd in UTF-16) samen met het zout:

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

De waarde die is opgeslagen in de syslogins tabel is de aaneenschakeling van:

[header] + [salt] + [hash]
0x0100 9A664D79 6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3

Wat je kunt zien in SQL Server:

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

name  PasswordHash
====  ======================================================
sa    0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
  • Versiekop:0100
  • Zout (vier bytes):9A664D79
  • Hash:6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3 (SHA-1 is 20 bytes; 160 bits)

Validatie

U valideert een wachtwoord door dezelfde hash uit te voeren:

  • pak het zout uit de opgeslagen PasswordHash :0x9A664D79

en voer de hash opnieuw uit:

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

die naar dezelfde hash zal komen, en je weet dat het wachtwoord correct is.

Wat ooit goed was, is nu zwak

Het hash-algoritme dat in 1999 met SQL Server 7 werd geïntroduceerd, was goed voor 1999.

  • Het is goed dat de wachtwoord-hash is gezouten.
  • Het is goed om toe te voegen de salt naar het wachtwoord, in plaats van prepend het.

Maar tegenwoordig is het achterhaald. Het voert de hash maar één keer uit, waar het een paar duizend keer moet worden uitgevoerd om brute-force-aanvallen te dwarsbomen.

In feite zal Microsoft's Baseline Security Analyzer, als onderdeel van zijn controles, proberen wachtwoorden bruteforceren. Als het iets raadt, rapporteert het de wachtwoorden als zwak. En het wordt wel wat.

Brute forceren

Om u te helpen bij het testen van enkele wachtwoorden:

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

Vanaf SQL Server 2012 schakelde Microsoft over op het gebruik van SHA-2 512-bit:

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

Het versievoorvoegsel wijzigen in 0x0200 :

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

name  PasswordHash
----  --------------------------------
xkcd  0x02006A80BA229556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
  • Versie:0200 (SHA-2 256-bit)
  • Zout:6A80BA22
  • Hash (64 bytes):9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38

Dit betekent dat we het UTF-16-gecodeerde wachtwoord hashen, met het salt-achtervoegsel:

  • SHA512("correcte nietje voor paardenbatterij" +6A80BA22 )
  • SHA512(63006f0072007200650063007400200068006f0072007300650020006200610074007400650072007900200073007400610070006c006500 + 6A80BA22 )
  • 9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38


  1. Slaapstand:Index maken

  2. Voer meerdere query's uit in één Oracle-opdracht in C#

  3. Postgres-query om te controleren of een string een getal is

  4. MySQL InnoDB Cluster 8.0 - Een complete operatie walk-through:deel twee