Algorytm haszowania hasła serwera SQL:
hashBytes = 0x0100 | fourByteSalt | SHA1(utf16EncodedPassword+fourByteSalt)
Na przykład, aby zahaszować hasło „prawidłowe zszywki do baterii konia” . Najpierw generujemy losową sól:
fourByteSalt = 0x9A664D79;
A następnie zahaszuj hasło (zakodowane w UTF-16) wraz z solą:
SHA1("correct horse battery staple" + 0x9A66D79);
=SHA1(0x63006F007200720065006300740020006200610074007400650072007900200068006F00720073006500200073007400610070006C006500 0x9A66D79)
=0x6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
Wartość przechowywana w syslogins
tabela jest konkatenacją:
[nagłówek] + [sól] + [hasz]0x0100
9A664D79
6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
Co możesz zobaczyć w SQL Server:
SELECT
name, CAST(password AS varbinary(max)) AS PasswordHash
FROM sys.syslogins
WHERE name = 'sa'
name PasswordHash
==== ======================================================
sa 0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
- Nagłówek wersji:
0100
- Sól (cztery bajty):
9A664D79
- Hash:
6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
(SHA-1 to 20 bajtów; 160 bitów)
Weryfikacja
Potwierdzasz hasło, wykonując ten sam skrót:
- wybierz sól z zapisanego
PasswordHash
:0x9A664D79
i ponownie wykonaj skrót:
SHA1("correct horse battery staple" + 0x9A66D79);
który otrzyma ten sam hash i wiesz, że hasło jest poprawne.
Co kiedyś było dobre, ale teraz jest słabe
Algorytm haszujący wprowadzony w SQL Server 7 w 1999 roku był dobry na rok 1999.
- Dobrze, że hash hasła jest solony.
- Dobrze jest dołączyć sól do hasła, a nie poprzedzenie to.
Ale dziś jest przestarzały. Uruchamia hash tylko raz, ale powinien uruchomić go kilka tysięcy razy, aby udaremnić ataki siłowe.
W rzeczywistości Baseline Security Analyzer firmy Microsoft będzie, w ramach swoich kontroli, próbował wymusić na hasłach bruteforce. Jeśli odgadnie, zgłasza hasła jako słabe. I dostaje trochę.
Brutalne wymuszanie
Aby pomóc Ci przetestować niektóre hasła:
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 i SHA-512
Począwszy od SQL Server 2012, firma Microsoft przeszła na używanie SHA-2 512-bitowego:
hashBytes = 0x0200 | fourByteSalt | SHA512(utf16EncodedPassword+fourByteSalt)
Zmiana prefiksu wersji na 0x0200
:
SELECT
name, CAST(password AS varbinary(max)) AS PasswordHash
FROM sys.syslogins
name PasswordHash
---- --------------------------------
xkcd 0x02006A80BA229556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
- Wersja:
0200
(SHA-2 256-bitowy) - Sól:
6A80BA22
- Hash (64 bajty):
9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
Oznacza to, że haszujemy hasło zakodowane w UTF-16 z sufiksem soli:
- SHA512(„prawidłowa zszywka akumulatora konia” +
6A80BA22
) - SHA512(
63006f0072007200650063007400200068006f0072007300650020006200610074007400650072007900200073007400610070006c006500
+6A80BA22
) 9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38