sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo descifrar una contraseña del servidor SQL?

El algoritmo de hashing de contraseñas de SQL Server:

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

Por ejemplo, para codificar la contraseña "grapa de batería de caballo correcta" . Primero generamos un poco de sal aleatoria:

fourByteSalt = 0x9A664D79;

Y luego hash la contraseña (codificada en UTF-16) junto con la sal:

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

El valor almacenado en syslogins tabla es la concatenación de:

[encabezado] + [sal] + [hash]
0x0100 9A664D79 6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3

Que puedes ver en SQL Server:

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

name  PasswordHash
====  ======================================================
sa    0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
  • Encabezado de la versión:0100
  • Sal (cuatro bytes):9A664D79
  • Hash:6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3 (SHA-1 tiene 20 bytes; 160 bits)

Validación

Validas una contraseña realizando el mismo hash:

  • toma la sal del PasswordHash guardado :0x9A664D79

y realiza el hash de nuevo:

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

que resultará en el mismo hash, y sabes que la contraseña es correcta.

Lo que una vez fue bueno, pero ahora es débil

El algoritmo hash introducido con SQL Server 7, en 1999, fue bueno para 1999.

  • Es bueno que la contraseña tenga sal.
  • Es bueno añadir la sal a la contraseña, en lugar de anteponer eso.

Pero hoy está desactualizado. Solo ejecuta el hash una vez, donde debería ejecutarlo unas miles de veces, para frustrar los ataques de fuerza bruta.

De hecho, Baseline Security Analyzer de Microsoft, como parte de sus comprobaciones, intentará forzar contraseñas por fuerza bruta. Si adivina alguna, informa que las contraseñas son débiles. Y recibe algo.

Fuerza bruta

Para ayudarte a probar algunas contraseñas:

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))

Servidor SQL 2012 y SHA-512

A partir de SQL Server 2012, Microsoft pasó a utilizar SHA-2 de 512 bits:

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

Cambiar el prefijo de la versión a 0x0200 :

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

name  PasswordHash
----  --------------------------------
xkcd  0x02006A80BA229556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
  • Versión:0200 (SHA-2 de 256 bits)
  • Sal:6A80BA22
  • Hash (64 bytes):9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC63826B>7

Esto significa que codificamos la contraseña codificada en UTF-16, con el sufijo salt:

  • SHA512("grapa de batería de caballo correcta" +6A80BA22 )
  • SHA512(63006f0072007200650063007400200068006f0072007300650020006200610074007400650072007900200073007400610070006c006500 + 6A80BA22 )
  • 9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38