Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como descriptografar uma senha do servidor SQL?


O algoritmo de hash de senha do SQL Server:
hashBytes = 0x0100 | fourByteSalt | SHA1(utf16EncodedPassword+fourByteSalt)

Por exemplo, para fazer o hash da senha "grampo correto da bateria do cavalo" . Primeiro, geramos algum sal aleatório:
fourByteSalt = 0x9A664D79;

E, em seguida, faça o hash da senha (codificada em UTF-16) junto com o sal:
 SHA1("correct horse battery staple" + 0x9A66D79);
=SHA1(0x63006F007200720065006300740020006200610074007400650072007900200068006F00720073006500200073007400610070006C006500 0x9A66D79)
=0x6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3

O valor armazenado nos syslogins table é a concatenação de:

[cabeçalho] + [sal] + [hash]
0x0100 9A664D79 6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3

Que você pode ver no SQL Server:
SELECT 
   name, CAST(password AS varbinary(max)) AS PasswordHash
FROM sys.syslogins
WHERE name = 'sa'

name  PasswordHash
====  ======================================================
sa    0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
  • Cabeçalho da versão:0100
  • Sal (quatro bytes):9A664D79
  • Hash:6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3 (SHA-1 é 20 bytes; 160 bits)

Validação


Você valida uma senha executando o mesmo hash:
  • pegue o salt do PasswordHash salvo :0x9A664D79

e execute o hash novamente:
SHA1("correct horse battery staple" + 0x9A66D79);

que resultará no mesmo hash e você sabe que a senha está correta.

O que antes era bom, mas agora é fraco


O algoritmo de hash introduzido com o SQL Server 7, em 1999, era bom para 1999.
  • É bom que o hash da senha seja salgado.
  • É bom anexar o sal para a senha, em vez de prefixar isto.

Mas hoje está desatualizado. Ele executa o hash apenas uma vez, onde deve executá-lo alguns milhares de vezes, para impedir ataques de força bruta.

Na verdade, o Baseline Security Analyzer da Microsoft, como parte de suas verificações, tentará usar senhas de força bruta. Se adivinhar alguma, ele relata as senhas como fracas. E consegue alguns.

Força Bruta


Para ajudá-lo a testar algumas senhas:
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 partir do SQL Server 2012, a Microsoft passou a usar SHA-2 de 512 bits:
hashBytes = 0x0200 | fourByteSalt | SHA512(utf16EncodedPassword+fourByteSalt)

Alterando o prefixo da versão para 0x0200 :
SELECT 
   name, CAST(password AS varbinary(max)) AS PasswordHash
FROM sys.syslogins

name  PasswordHash
----  --------------------------------
xkcd  0x02006A80BA229556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
  • Versão:0200 (SHA-2 256 bits)
  • Sal:6A80BA22
  • Hash (64 bytes):9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38

Isso significa que hash a senha codificada em UTF-16, com o sufixo salt:
  • SHA512("grampo correto da bateria do cavalo" +6A80BA22 )
  • SHA512(63006f0072007200650063007400200068006f0072007300650020006200610074007400650072007900200073007400610070006c006500 + 6A80BA22 )
  • 9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38