Algoritmus hašování hesla serveru SQL:
hashBytes = 0x0100 | fourByteSalt | SHA1(utf16EncodedPassword+fourByteSalt)
Chcete-li například zahašovat heslo "správná svorka koňské baterie" . Nejprve vygenerujeme nějakou náhodnou sůl:
fourByteSalt = 0x9A664D79;
A pak heslo (zakódované v UTF-16) hashujte spolu se solí:
SHA1("correct horse battery staple" + 0x9A66D79);
=SHA1(0x63006F007200720065006300740020006200610074007400650072007900200068006F00720073006500200073007400610070006C006500 0x9A66D79)
=0x6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
Hodnota uložená v syslogins
tabulka je zřetězení:
[hlavička] + [sůl] + [hash]
0x0100
9A664D79
6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
Což můžete vidět na SQL Server:
SELECT
name, CAST(password AS varbinary(max)) AS PasswordHash
FROM sys.syslogins
WHERE name = 'sa'
name PasswordHash
==== ======================================================
sa 0x01009A664D796EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
- Záhlaví verze:
0100
- Sůl (čtyři bajty):
9A664D79
- Hash:
6EDB2FA35E3B8FAB4DBA2FFB62F5426B67FE54A3
(SHA-1 je 20 bajtů; 160 bitů)
Ověření
Heslo ověříte provedením stejného hash:
- vezměte sůl z uloženého
PasswordHash
:0x9A664D79
a proveďte hash znovu:
SHA1("correct horse battery staple" + 0x9A66D79);
který vyjde na stejný hash a vy víte, že heslo je správné.
Co bylo kdysi dobré, ale nyní je slabé
Hašovací algoritmus představený s SQL Server 7 v roce 1999 byl dobrý pro rok 1999.
- Je dobře, že heslo hash salted.
- Je dobré připojit sůl k heslu, nikoli předřazení to.
Ale dnes je to zastaralé. Spustí hash pouze jednou, kde by ho měl spustit několik tisíckrát, aby zabránil útokům hrubou silou.
Ve skutečnosti se Baseline Security Analyzer společnosti Microsoft v rámci svých kontrol pokusí brutálně vynutit hesla. Pokud nějaké uhodne, hlásí hesla jako slabá. A nějaké to dostává.
Hrubé vynucování
Abychom vám pomohli otestovat některá hesla:
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 a SHA-512
Počínaje SQL Server 2012 přešel Microsoft na používání SHA-2 512-bit:
hashBytes = 0x0200 | fourByteSalt | SHA512(utf16EncodedPassword+fourByteSalt)
Změna předpony verze na 0x0200
:
SELECT
name, CAST(password AS varbinary(max)) AS PasswordHash
FROM sys.syslogins
name PasswordHash
---- --------------------------------
xkcd 0x02006A80BA229556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A006B33DEC99FCF1A822393FC66226B7D38
- Verze:
0200
(256bitový SHA-2) - Sůl:
6A80BA22
- Hash (64 bajtů):
9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D630501147D6A038ABD23A13038ABD92A1A038ABD29
To znamená, že heslo zakódované v UTF-16 hašujeme s příponou salt:
- SHA512("správná svorka koňské baterie" +
6A80BA22
) - SHA512(
63006f0072007200650063007400200068006f007200730065002000620061007400740065007200779300206006070770602006 +
6A80BA22
) 9556EB280AA7818FAF63A0DA8D6B7B120C6760F0EB0CB5BB320A961B04BD0836 0C0E8CC4C326220501147D6A9ABD2A0069FC82A006F213D9