Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come decrittografare una password dal server SQL?

L'algoritmo di hashing della password di SQL Server:

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

Ad esempio, per eseguire l'hashing della password "correggere il punto batteria del cavallo" . Per prima cosa generiamo del sale casuale:

fourByteSalt = 0x9A664D79;

E poi hash la password (codificata in UTF-16) insieme al sale:

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

Il valore memorizzato nei syslogins table è la concatenazione di:

[intestazione] + [sale] + [cancelletto]
0x0100 9A664D79 6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3

Che puoi vedere in SQL Server:

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

name  PasswordHash
====  ======================================================
sa    0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
  • Intestazione versione:0100
  • Sale (quattro byte):9A664D79
  • Hash:6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3 (SHA-1 è 20 byte; 160 bit)

Convalida

Convalidi una password eseguendo lo stesso hash:

  • Prendi il sale dal PasswordHash salvato :0x9A664D79

ed esegui di nuovo l'hash:

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

che uscirà con lo stesso hash e sai che la password è corretta.

Ciò che una volta era buono, ma ora è debole

L'algoritmo di hashing introdotto con SQL Server 7, nel 1999, era valido per il 1999.

  • È positivo che l'hash della password sia salito.
  • È utile aggiungere il sale alla password, anziché anteporre esso.

Ma oggi è antiquato. Esegue l'hash solo una volta, dove dovrebbe eseguirlo alcune migliaia di volte, al fine di contrastare gli attacchi di forza bruta.

In effetti, Baseline Security Analyzer di Microsoft, come parte dei suoi controlli, tenterà di forzare le password. Se ne indovina, segnala le password come deboli. E ne ottiene alcuni.

Forza bruta

Per aiutarti a testare alcune password:

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

A partire da SQL Server 2012, Microsoft è passata all'utilizzo di SHA-2 a 512 bit:

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

Modifica del prefisso della versione in 0x0200 :

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

name  PasswordHash
----  --------------------------------
xkcd  0x02006A80BA229556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
  • Versione:0200 (SHA-2 256 bit)
  • Sale:6A80BA22
  • Hash (64 byte):9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A8222393FC66226B>codice

Ciò significa che eseguiamo l'hashing della password codificata UTF-16, con il suffisso salt:

  • SHA512("corretto punto batteria del cavallo" +6A80BA22 )
  • SHA512(63006f0072007200650063007400200068006f0072007300650020006200610074007400650072007900200073007400610070006c006500 + 6A80BA22 )
  • 9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38