Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie entschlüsselt man ein Passwort vom SQL-Server?

Der Passwort-Hashing-Algorithmus von SQL Server:

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

Zum Beispiel, um das Passwort "korrekte Klammer für Pferdebatterien" zu hashen . Zuerst generieren wir ein zufälliges Salz:

fourByteSalt = 0x9A664D79;

Und hashen Sie dann das Passwort (kodiert in UTF-16) zusammen mit dem Salt:

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

Der in den syslogins gespeicherte Wert Tabelle ist die Verkettung von:

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

Was Sie in SQL Server sehen können:

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

name  PasswordHash
====  ======================================================
sa    0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
  • Versionskopf:0100
  • Salt (vier Bytes):9A664D79
  • Hash:6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3 (SHA-1 ist 20 Byte; 160 Bit)

Validierung

Sie validieren ein Passwort, indem Sie denselben Hash ausführen:

  • holen Sie sich das Salz aus dem gespeicherten PasswordHash :0x9A664D79

und führen Sie den Hash erneut aus:

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

was zu demselben Hash führt, und Sie wissen, dass das Passwort korrekt ist.

Was einst gut war, aber jetzt schwach ist

Der 1999 mit SQL Server 7 eingeführte Hash-Algorithmus war gut für 1999.

  • Es ist gut, dass der Passwort-Hash gesalzen ist.
  • Es ist gut, anzuhängen das Salt dem Passwort, anstatt voranzustellen es.

Aber heute ist es überholt. Es führt den Hash nur einmal aus, wo er ein paar tausend Mal ausgeführt werden sollte, um Brute-Force-Angriffe zu vereiteln.

Tatsächlich wird der Baseline Security Analyzer von Microsoft im Rahmen seiner Prüfungen versuchen, Kennwörter brutal zu erzwingen. Wenn es welche errät, meldet es die Passwörter als schwach. Und es bekommt einige.

Brute-Force

Um Ihnen beim Testen einiger Passwörter zu helfen:

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

Beginnend mit SQL Server 2012 wechselte Microsoft zur Verwendung von SHA-2 512-Bit:

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

Ändern des Versionspräfixes in 0x0200 :

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

name  PasswordHash
----  --------------------------------
xkcd  0x02006A80BA229556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
  • Version:0200 (SHA-2 256-Bit)
  • Salz:6A80BA22
  • Hash (64 Byte):9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38

Das heißt, wir hashen das UTF-16-codierte Passwort mit dem Salt-Suffix:

  • SHA512("korrekte Pferdebatterieklammer" +6A80BA22 )
  • SHA512(63006f0072007200650063007400200068006f0072007300650020006200610074007400650072007900200073007400610070006c006500 + 6A80BA22 )
  • 9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38