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